设计模式中的合成模式
合成模式即是来描述整体和部分关系的模式。使得客户端把一个个单独的成分对象和由他们复合成的对象同等对待。根据实现细节不同,分为两种方式:安全方式和透明方式。下面以一个几何图形的例子来了解下这2种方式.
一个简单的几何图形是有圆,直线,矩形组成.其中几何图形就是由一个或多个单独的直线,圆,矩形对象组成的符合对象.
所以本例一共有4个类,一个接口.Graphics 接口,line类,rectangle类,circle类,Picture类.根据两个UML注意区别安全方式和透明方式的实现细节.
1)安全方式

=====================================================================================
接口 Graphics
public interface Graphics {
public void draw();
}
类Line
public class Line implements Graphics {
public void draw()
{
System.out.println("画一条直线");
}
}
类Circle
public class Circle implements Graphics {
public void draw() {
System.out.println("画一个圆");
}
}
类Rectangle
public class Rectangle implements Graphics{
public void draw()
{
System.out.println("画一个矩形");
}
}
类Picture
import java.util.*;
public class Picture implements Graphics {
private List list=new ArrayList();
public void draw()
{
for(int i=0;i<list.size();i++)
{
Graphics g=(Graphics)list.get(i);
g.draw();
}
}
public void add(Graphics g)
{
list.add(g);
}
public void remove(Graphics g)
{
list.remove(g);
}
public Graphics getGraphics(int i)
{
return (Graphics)list.get(i);
}
}
=========================================================================================
2)透明方式
=====================================================================================
接口 Graphics
public interface Graphics {
public void draw();
public void add(Graphics g);
public void remove(Graphics g);
public Graphics getGraphics(int i);
}
类Line
public class Line implements Graphics{
public void add(Graphics g) {
}
public void draw() {
System.out.println("画一条直线");
}
public Graphics getGraphics(int i) {
return null;
}
public void remove(Graphics g) {
}
}
类Circle
public class Circle implements Graphics{
public void add(Graphics g) {
}
public void draw() {
System.out.println("画一个圆");
}
public Graphics getGraphics(int i) {
return null;
}
public void remove(Graphics g) {
}
}
类Rectangle
public class Rectangle implements Graphics {
public void add(Graphics g) {
}
public void draw() {
System.out.println("画一个矩形");
}
public Graphics getGraphics(int i) {
return null;
}
public void remove(Graphics g) {
}
}
类Picture
public class Picture implements Graphics {
private List list=new ArrayList();
public void draw()
{
for(int i=0;i<list.size();i++)
{
Graphics g=(Graphics)list.get(i);
g.draw();
}
}
public void add(Graphics g)
{
list.add(g);
}
public void remove(Graphics g)
{
list.remove(g);
}
public Graphics getGraphics(int i)
{
return (Graphics)list.get(i);
}
}
=========================================================================================
在安全方式和透明方式中,不同之处是实现对子类的管理方法:add(),remove(),getGraphics()的位置不同,是在Graphics接口中实现,还是在复合类Picture中实现.
在安全方式中,管理方法在复合类Picture中实现,如果客户端在对Line()等单独的成分对象发送add()等消息时,无法编译通过.
在透明方式中,将管理方法在接口中定义,所有单独成分对象(如:Line()等)由于实现了Graphics接口,必须实现add()等管理方法,即使是方法中不需要任何操作,当客户端在对单独成分对象发送add()等消息时,编译通过,但在程序运行时,则可能会抛出异常.这样做的好处是都有相同的接口,客户端可以同等的对待对象.
适合使用合成模式的条件:
1)需要描述对象的部分和整体的等级结构
2)客户端需要忽略掉整体构件和个体构件的区别
合成模式的优点:
1.可以很容易的增加新种类的构件
2.使用合成模式可以使客户端变得很容易设计,因为客户端不需要知道构件是个体构件还是整体构件
缺点:
1.控制整体构件的类型比较困难
2.用继承方法增加新的行为很困难.
posted on 2007-07-01 10:21
李桢 阅读(297)
评论(0) 编辑 收藏 所属分类:
java设计模式