设计模式-组合模式

组合模式-Composite Pattern

组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。

自己的理解:对于一个树形结构,容器和子节点都有相同的方法(都继承于抽象构件),下面这个例子,因为叶子中没有add remove等方法,所以使用了抽象叶子和抽象容器,属于安全组合模式。

 抽象构件:它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。

●叶子构件:它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。

 容器构件:它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。

      组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理


抽象构件:

public interface IComponent {
    void show();
}

抽象叶子构件:

public abstract class Single implements IComponent {
    @Override
    public abstract void show();
}

具体叶子构件:

public class Button extends Single {
    @Override
    public void show() {
        System.out.println("绘制按钮");
    }
}
public class CheckBox extends Single {
    @Override
    public void show() {
        System.out.println("绘制选择栏");
    }
}

抽象容器构件:

public class SingleContent implements IComponent {

    private List<IComponent> singlelist = new ArrayList<>();

    protected String ContentName = null;

    public void setContentName(String CN){
        this.ContentName = CN;
    }


    public void show(){
        System.out.println(ContentName + "---->");
        singlelist.forEach((v)->v.show());
    }

    public void add(IComponent ic){
        singlelist.add(ic);
    }

    public void remove(IComponent ic){
        singlelist.remove(ic);
    }
}
具体容器构件:

public class CenterPanel extends SingleContent {

    public CenterPanel(){
        super.setContentName("CenterPanel");
    }
}
public class Window extends SingleContent {

    public Window(){
        super.setContentName("Windows");
    }

}

Client:

public class Client {

    public static void main(String[] args) {
        Single s1,s2;
        SingleContent c1,c2;

        s1 = new Button();
        s2 = new CheckBox();
        c1 = new Window();
        c2 = new CenterPanel();


        c1.add(s1);
        c1.add(s2);

        c2.add(s1);
        c2.add(s1);

        c1.show();
        c2.show();
    }
}





猜你喜欢

转载自blog.csdn.net/webmastar/article/details/79240560
今日推荐