結構模式-Composite模式

          一:使用場景

             1)使用的地方:樹形結構,分支結構等

             2)使用的好處:降低客戶端的使用,為了達到元件與組合件使用的一致性,增加了元件的編碼

             3)使用后的壞處:代碼不容易理解,需要你認真去研究,發現元件與組合件是怎么組合的

          二:一個實際的例子

              畫圖形,這個模式,稍微要難理解一點,有了例子就說明了一切,我畫的圖是用接口做的,代碼實現是抽象類為基類,你自己選擇了,接口也可以。

             


          1)先建立圖形元件

             package com.mike.pattern.structure.composite;
          /**
          * 圖形元件

          * @author taoyu

          * @since 2010-6-23
          */
          public abstract class Graph {
          /**圖形名稱*/
          protected String name;

          public Graph(String name){
             this.name=name;
          }

          /**畫圖*/
          public abstract void draw()throws GraphException;

          /**添加圖形*/
          public abstract void add(Graph graph)throws GraphException;

          /**移掉圖形*/
          public abstract void remove(Graph graph)throws GraphException;

          }

          2)建立基礎圖形圓

          package com.mike.pattern.structure.composite;
          import static com.mike.util.Print.print;

          /**
          * 圓圖形

          * @author taoyu

          * @since 2010-6-23
          */
          public class Circle extends Graph {

          public Circle(String name){
             super(name);
          }

          /**
          * 圓添加圖形
          * @throws GraphException 
          */
          @Override
          public void add(Graph graph) throws GraphException {
             throw new GraphException("圓是基礎圖形,不能添加");
          }

          /**
          * 圓畫圖
          */
          @Override
          public void draw()throws GraphException {
             print(name+"畫好了");
          }

          /**
          * 圓移掉圖形
          */
          @Override
          public void remove(Graph graph)throws GraphException {
             throw new GraphException("圓是基礎圖形,不能移掉");
          }

          }

          3)建立基礎圖形長方形

          package com.mike.pattern.structure.composite;
          import static com.mike.util.Print.print;
          /**
          * 長方形

          * @author taoyu

          * @since 2010-6-23
          */
          public class Rectangle extends Graph {

          public Rectangle(String name){
             super(name);
          }

          /**
          * 長方形添加
          */
          @Override
          public void add(Graph graph) throws GraphException {
             throw new GraphException("長方形是基礎圖形,不能添加");
          }

          /**
          * 畫長方形
          */
          @Override
          public void draw() throws GraphException {
             print(name+"畫好了");
          }

          @Override
          public void remove(Graph graph) throws GraphException {
             throw new GraphException("長方形是基礎圖形,不能移掉");
          }

          }

          4)最后簡歷組合圖形

          package com.mike.pattern.structure.composite;

          import java.util.ArrayList;
          import java.util.List;
          import static com.mike.util.Print.print;

          /**
          * 圖形組合體

          * @author taoyu

          * @since 2010-6-23
          */
          public class Picture extends Graph {
          private List<Graph> graphs;

          public Picture(String name){
             super(name);
             /**默認是10個長度*/
             graphs=new ArrayList<Graph>();
          }


          /**
          * 添加圖形元件
          */
          @Override
          public void add(Graph graph) throws GraphException {
             graphs.add(graph);
          }

          /**
          * 圖形元件畫圖
          */
          @Override
          public void draw() throws GraphException {
             print("圖形容器:"+name+" 開始創建");
             for(Graph g : graphs){
              g.draw();
             }
          }

          /**
          * 圖形元件移掉圖形元件
          */
          @Override
          public void remove(Graph graph) throws GraphException {
             graphs.remove(graph);
          }

          }

          5)最后測試

          public static void main(String[] args)throws GraphException {
             /**畫一個圓,圓里包含一個圓和長方形*/
             Picture picture=new Picture("立方體圓");
             picture.add(new Circle("圓"));
             picture.add(new Rectangle("長方形"));
            
             Picture root=new Picture("怪物圖形"); 
             root.add(new Circle("圓"));
             root.add(picture);
             root.draw();
          }

          6)使用心得:的確降低了客戶端的使用情況,讓整個圖形可控了,當是你要深入去理解,才真名明白采用該模式的含義,不太容易理解。

          posted on 2012-08-06 17:49 陳睿 閱讀(247) 評論(0)  編輯  收藏 所屬分類: 設計模式

          導航

          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 从化市| 时尚| 武汉市| 海安县| 石林| 鄄城县| 周至县| 景宁| 富锦市| 沙洋县| 都安| 苗栗县| 清水县| 阜宁县| 鄂伦春自治旗| 汉中市| 炉霍县| 扶绥县| 湖南省| 乐安县| 烟台市| 公主岭市| 体育| 民勤县| 望江县| 陇南市| 德兴市| 广河县| 蒙山县| 北川| 正阳县| 喀什市| 阿拉善盟| 三台县| 岚皋县| 九龙城区| 广宁县| 原平市| 榆社县| 沁水县| 磴口县|