组合模式
简介
组合模式允许一致的对待复杂和原始对象的接口,在面向对象编程技术中,组合对象是一个或者多个相似对象构成的对象,各个对象有相似的功能。关键的概念是客户类以相同的方式对待单独的对象与一组对象,即所谓的组合对象。
组合模式有时候又叫做部分-整体模式,在树形结构中模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式将对象组合成树形结构,以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
示例
Component类为组合模式中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。
public abstract class ChessComponent
{
public abstract void setPosition(int x,int y);
public abstract in[] getPosition();
public abstract String showInfo();
public abstract int getColor();
}
组件
class BlackChess extends ChessComponent
{
int[] position = null;
private static final int BLACK = 1;
public void setPosition(int x,int y){...}
public String showInfo(){...}
public int getColor(){...}
...
}
class WhiteChess extends ChessComponent
{
int[] position = null;
private static final int WHITE = 0;
public void setPosition(int x,int y){...}
public String showInfo(){...}
public int getColor(){...}
...
}
commposite表示组合部件,实现操作子部件的所有方法,实现所有在component的操作。
class Composite extends ChessComponent
{
private int[] position = null;
private ArrayList<ChessComponent> chessArray = null;
public void attach(ChessComponent piece)
{...}
public void detach(ChessComponent piece){...}
public void removeAllElement(){...}
....
}
示例二
component:
public abstract interface Airforce
{
public abstract String fight();
public abstract String getDescription();
}
public abstract class Fighter implements Airforce
{
public abstract String fight();
public String getDescription(){return "Fighter";};
}
public abstract class Bomber implements Airforce
{
public abstract String fight();
public String getDescription(){return "Bomber";};
}
给出具体的类实现
public class F22 extends Fighter
{
public String fight(){return "F22 Fighter";};
public String getDescription(){return "F22";};
}
public class B2 extends Bomber
{
public String fight(){return "B2 Fighter";};
public String getDescription(){return "B2";};
}
composite类
public class AirUnit implements Airforce
{
private ArrayList<Airforce> parts;
public void attach(Airforce force){if(force!=null)parts.add(force);}
public void detach(Airforce force){...}
public String fight(){}
public String getDescription(){return ...}
}
实现一个空军团,54个F22,12个轰炸机
public class AirGroup extends AirUnit
{
Airforce[] fighters = new Airforce[54];
Airforce[] bombers = new Airforce[12];
for(..)
fight[i] = new F22();
}
安全形式的组合模型
安全形式是指在composite类中声明所有的用来管理子类对象的方法,包括add(),remove()等。而在component接口和树叶类型的对象中不包含管理子类的对象的方法。
缺点:
安全形式的组合模型的缺点是。Component层次结构类的超类与组合子类的借口不一致。
透明形式的组合模型、
与安全形式的组合模型不同,透明形式的组合模型在component类中声明所有用来管理子类的方法
这样做的好处是所有的构建类具有相同的接口。缺点是不够安全。