组合模式例子

来源:互联网 发布:python 多维高斯分布 编辑:程序博客网 时间:2024/06/05 08:06

因为软件体系结构书上的例子据说并不太适合用组合模式去解决,又苦于无法想出符合组合模式使用方式的例子,因此搜索了一个相关例

组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。

1、建一个普通接口,里面有一个抽象方法



2、建两个普通的对象实现它





3、建一个特殊的类(组合对象)实现它,这个类是组合模式的核心:



4.测试类



打印结果:

 

代码如下:

/**
* 外形接口
*
* @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();
}
}
}

通过这样的一个画图用方法可以联想到不少有关的组合模式例子,上述例子并不完善,如需参考可根据自己对组合模式的理解去进行修改。

0 0
原创粉丝点击