码迷,mamicode.com
首页 > 其他好文 > 详细

合成模式

时间:2015-08-15 01:33:52      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

合成模式属于对象的结构模式,又叫做部分-整体模式。

PC的文件系统也是典型的合成模式。文件夹中可以有文件和文件夹。。。。

道士的故事:

从前有个山,从前有个庙,从前有个道士讲故事。讲的啥故事?从前有个山,从前有个庙,从前有个道士讲故事。讲的啥故事?从前有个山......。在这个故事里有山,有庙,有道士,有故事。因此故事的角色有两种:一种里面没有其他角色,例如山,道士,庙;另一种内部有其他角色,例如故事。故事里面又有山、道士、庙、故事等。

模拟系统如下图所示:

技术分享

 

这种形式涉及到三个角色:

  • 抽象构件角色:由故事角色接口扮演。这是一个抽象角色,给所有角色对象规定一个接口,可以用来管理所有的诸如山,庙,道士,和故事对象。
  • 树叶构件角色:由山,庙和道士扮演。树叶对象没有下级子对象。
  • 树枝构件角色:由故事角色扮演。

接下来给出一个绘图软件的例子。

用绘图软件的例子,说明合成模式的应用。一个绘图系统给出各种工具用来描绘由线、长方形和圆形等基本图形组成的图形。显然,一个复合的图形既然是由这些基本图形组成的,那么合成模式就是一个合适的设计模式。

可以想象,设计应当包括Line、Rectangle和Circle等对象,而且每一个对象都应该配备有一个draw()方法,在调用时,会画出对象所代表的图形。

同时,由于一个复杂的图形是由基本图形组合而成的,因此,一个合成的图形应当有一个列表,存储对所有的基本图形对象的引用。复合图形的draw()方法在调用时,应当逐一调用所有列表上的基本图形对象的draw()方法。

/*
* 抽象构件角色实现
* */
public abstract class Graphic {
    public abstract void draw();
}

 

/**
 * 树枝构建角色实现
 */
public class Picture extends Graphic {
    private Vector list=new Vector();
    @Override
    public void draw() {
        for(int i=0;i<list.size();i++)
        {
            Graphic g=(Graphic)list.get(i);
            g.draw();
        }
    }
    /*
    * 聚集管理方法,增加一个子构件对象
    * */
    public void add(Graphic g)
    {
        list.add(g);
    }
    public void remove(Graphic g)
    {
        list.remove(g);
    }
    /*
    * 返还一个子构件对象
    * */
    public Graphic getChild(int i)
    {
        return (Graphic)list.get(i);
    }
 }

 

/**
 * 树叶构件角色实现.
 */
public class Line extends Graphic {

    @Override
    public void draw() {
        //write your code here
    }
}



public class Rectangle extends  Graphic {
    @Override
    public void draw() {
        //write your code
    }
}


public class Circle extends Graphic {
    @Override
    public void draw() {
        //write your code
    }
}

 需要描述对象的整体和部分的整体的等级结构时可以考虑使用合成模式

合成模式

标签:

原文地址:http://www.cnblogs.com/xtsylc/p/4731602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!