一:使用场景
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)使用心得:的确降低了客户端的使用情况,让整个图形可控了,当是你要深入去理解,才真名明白采用该模式的含义,不太容易理解。