1、建一个普通接口,里面有一个抽象方法
![](https://i-blog.csdnimg.cn/blog_migrate/fa79ac9108cd832849c7ea834b3a0646.bmp)
2、建两个普通的对象实现它
![](https://i-blog.csdnimg.cn/blog_migrate/b5300191909ae9bdc5d571bcd51e3c3f.bmp)
![](https://i-blog.csdnimg.cn/blog_migrate/4752ce9e73e09b060e28afddf4e62182.bmp)
3、 建一个特殊的类(组合对象)实现它,这个类是组合模式的核心:
![](https://i-blog.csdnimg.cn/blog_migrate/ae26091fe34226484e9903730f5fad35.jpeg)
4.测试类
![](https://i-blog.csdnimg.cn/blog_migrate/2c160a079b2f0eb82fb637738f28a9ce.jpeg)
打印结果:
![](https://i-blog.csdnimg.cn/blog_migrate/335acf89905006e7ddd25750d28d67f7.bmp)
因为软件体系结构书上的例子据说并不太适合用组合模式去解决,又苦于无法想出符合组合模式使用方式的例子,因此搜索了一个相关例
代码如下:
/**
* 外形接口
*
* @author Administrator
*/
public interface Shape {
/**
* 图的方法
*/
void draw();
}
public class Line implements Shape {
/**
* 实现接口的方法:线的画法
*/
public void draw() {
System.out.println("线的画法!");
}
}
public class Circle implements Shape {
/**
* 圆的画法
*/
public void draw() {
System.out.println("圆的画法!");
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 同样是实现了Shape,那么意味着,这个类实例出来也是一个Shape 有别于Line和Circle类,这个类多了一个add()方法用来添加Shape对象
* 言下之意就是,这个Shape的子类可以存放多个Shape对象 这个Shape对象和Line和Circle类一样,都实现了接口中的draw()方法;
* 所以这里的draw()方法就是把添加进来的shape对象循环输出,保证调用的地方 只要统一调用draw()方法即可。
* 组合模式(Composite)的核心:使得用户对单个对象和组合对象的使用具有一致性
*
* @author Administrator
*
*/
public class Drawing implements Shape {
private List<Shape> list;
/**
* 无参实例
*/
public Drawing() {
list = new ArrayList<Shape>();
}
/**
* 添加一个Shape对象
*/
public void add(Shape shape) {
list.add(shape);
}
/**
* 实现接口的统一调用方法
*/
public void draw() {
for (Iterator iter = list.iterator(); iter.hasNext();) {
Shape tempShape = (Shape) iter.next();
tempShape.draw();
}
}
}
/**
* 测试组合模式
*
* @author Administrator
*
*/
public class TestComposite {
public static void main(String[] args) {
Shape[] array = new Shape[3];
// 前两个都是单个Shape对象
array[0] = new Line();
array[1] = new Circle();
// 难点:这个Drawing实现了Shape,所以它也是一个Shape,只是它多了一个添加Shape对象的方法
// 所以这个是个Shape的组合对象,【这个Shape存放Shape对象的集合】,这个Shape里可以含有多个Shape对象
Drawing dwg = new Drawing();
dwg.add(new Line());
dwg.add(new Circle());
array[2] = dwg;
// 画出所有的图形,注意:用一致的方式(都是调用draw();)来访问所有对象
for (int i = 0; i < 3; ++i) {
System.out.println("数组" + (i + 1) + "的对象如下:");
array[i].draw();
}
}
}
通过这样的一个画图用方法可以联想到不少有关的组合模式例子,上述例子并不完善,如需参考可根据自己对组合模式的理解去进行修改。