组合模式-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(); } }