设计模式-结构型软件设计模式(一)

来源:互联网 发布:js的缺点 编辑:程序博客网 时间:2024/05/21 14:43

组合模式

简介

组合模式允许一致的对待复杂和原始对象的接口,在面向对象编程技术中,组合对象是一个或者多个相似对象构成的对象,各个对象有相似的功能。关键的概念是客户类以相同的方式对待单独的对象与一组对象,即所谓的组合对象。
组合模式有时候又叫做部分-整体模式,在树形结构中模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
组合模式将对象组合成树形结构,以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
这里写图片描述

示例

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类中声明所有用来管理子类的方法
透明组合模型

这样做的好处是所有的构建类具有相同的接口。缺点是不够安全。

原创粉丝点击