组合模式
将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性
角色
-
抽象构件角色(Component):组合中对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明1个接口用于访问和管理Component子部件,接口可用于管理所有的子对象。(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它
-
树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件,在Component接口中实现与子部件有关的操作
-
树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为
-
客户角色(Client):通过component接口操纵组合部件的对象
抽象构件角色: Number
package com.zhiwei.composite;public interface Number { double computer(double x, double y);}
树叶构件角色
package com.zhiwei.composite;public class AddNumber implements Number { public double computer(double x, double y) { double result = x + y; System.out.println("AddNumber计算结果:"+result); return result; }}
package com.zhiwei.composite;public class SubNumber implements Number { public double computer(double x, double y) { double result = x - y; System.out.println("SubNumber计算结果:"+result); return result; }}
package com.zhiwei.composite;public class MulNumber implements Number { public double computer(double x, double y) { double result = x * y; System.out.println("MulNumber计算结果:"+result); return result; }}
package com.zhiwei.composite;public class DivNumber implements Number { public double computer(double x, double y) { double result = x/y; System.out.println("DivNumber计算结果:"+result); return result; }}
树枝构件角色:CompositeNumber
package com.zhiwei.composite;import java.util.List;import java.util.ArrayList;public class CompositeNumber implements Number { private Listlist = new ArrayList (); public void add(Number organ) { list.add(organ); } public void remove(Number organ) { list.remove(organ); } public Number getChild(int i) { return list.get(i); } public double computer(double x, double y) { double count = 0d; for (int i = 0; i < list.size(); i++) { Number number = list.get(i); count += number.computer(x,y); } return count; }}
测试代码:
CompositeNumber compositeNumber = new CompositeNumber();compositeNumber.add(new AddNumber()); //加法:8compositeNumber.add(new SubNumber()); //减法:4compositeNumber.add(new MulNumber()); //乘法:12compositeNumber.add(new DivNumber()); //除法:3//8+4+12+3=27System.out.println("总运算结果为:"+ compositeNumber.computer(6,2));
结果:
组合模式分析
组合模式中,枝干和树叶组件根据Java多态特点,通过接口联系在一起,树叶组件负责实现具体的功能(功能比较单一),树枝组件通过组合树叶组件来实现不同的功能,这种设计思想和外观设计模式很类似,外观类也是通过组合内部的子系统的功能,为客户端提供统一的访问接口,只是组合模式职责更加单一