每天一个设计模式之composite

来源:互联网 发布:黄景瑜是淘宝什么模特 编辑:程序博客网 时间:2024/05/01 12:58

这篇文章是参考的wiki:

http://en.wikipedia.org/wiki/Composite_pattern


首先来看一个例子:

一个绘图软件,可以画出椭圆形,也可以画一个包含多种图形的组合图形(椭圆形,三角形,正方形等等)。

有一个Graphic接口,椭圆形,正方形,三角形都实现了这个接口。

从下面的代码我们可以看出composite的意义:对于客户程序来说,打印椭圆形和打印组合图形的语句都是一样的(graphic.print())。

也就是文中提到的:在composite模式中,对待单个对象和对待一组对象的方式是一样的。


实现的方式也很简单:

1,单个对象leaf实现,print()接口;

2,组合对象中有一个collection,存储了多个graphic对象;

3,组合对象同时也实现了print接口,只不过内容是循环将collection中的每个对象print出来。

4,组合对象可以添加,删除graphic对象。

import java.util.List;import java.util.ArrayList; /** "Component" */interface Graphic {     //Prints the graphic.    public void print();} /** "Composite" */class CompositeGraphic implements Graphic {     //Collection of child graphics.    private List<Graphic> childGraphics = new ArrayList<Graphic>();     //Prints the graphic.    public void print() {        for (Graphic graphic : childGraphics) {            graphic.print();        }    }     //Adds the graphic to the composition.    public void add(Graphic graphic) {        childGraphics.add(graphic);    }     //Removes the graphic from the composition.    public void remove(Graphic graphic) {        childGraphics.remove(graphic);    }} /** "Leaf" */class Ellipse implements Graphic {     //Prints the graphic.    public void print() {        System.out.println("Ellipse");    }} /** Client */public class Program {     public static void main(String[] args) {        //Initialize four ellipses        Ellipse ellipse1 = new Ellipse();        Ellipse ellipse2 = new Ellipse();        Ellipse ellipse3 = new Ellipse();        Ellipse ellipse4 = new Ellipse();         //Initialize three composite graphics        CompositeGraphic graphic = new CompositeGraphic();        CompositeGraphic graphic1 = new CompositeGraphic();        CompositeGraphic graphic2 = new CompositeGraphic();         //Composes the graphics        graphic1.add(ellipse1);        graphic1.add(ellipse2);        graphic1.add(ellipse3);         graphic2.add(ellipse4);         graphic.add(graphic1);        graphic.add(graphic2);         //Prints the complete graphic (four times the string "Ellipse").        graphic.print();    }}

原创粉丝点击