组合模式(Composite)

来源:互联网 发布:redhat yum安装mysql 编辑:程序博客网 时间:2024/05/22 00:28

组合模式有时候又叫做部门-整体模式,它是我们树形机构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦

         将对象组合成树形结构以表示”部分-整体“的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性

两种实现方式:

a)      将管理子元素的方法定义在Composite类中

         组成:

         Component(抽象构件接口)

         ----为组合的对象声明接口

         ----在某些情况下爱实现从此接口派生的所有类共有的默认行为

         ----定义一个接口可以访问及管理它的多个子部件  

package com.ebuair.pattern.component;//Component(抽象构件接口)://为组合的对象声明接口//在某些情况下爱实现从此接口派生的所有类共有的默认行为//定义一个接口可以访问及管理它的多个子部件public interface Commonent {public void invokeMethod();}

     Leaf(叶部件)

         ----在组合中表示叶节点对象,叶节点没有子节点

         ----定义组合中接口对象的行为

package com.ebuair.pattern.component;//Leaf(叶部件)://在组合中表示叶节点对象,叶节点没有子节点//定义组合中接口对象的行为public class Leaf implements Commonent{@Overridepublic void invokeMethod() {System.out.println("invoke method!!!");}}

        Composite(组合类)

   ----定义有子节点(子部件)的部件的行为

         ----存储子节点(子部件)

         ----在Component接口中实现与子部件相关的操作

package com.ebuair.pattern.component;import java.util.ArrayList;import java.util.List;//Composite(组合类)//定义有子节点(子部件)的部件的行为//存储子节点(子部件)//在Component接口中实现与子部件相关的操作public class Composite implements Commonent {private List<Commonent> commonentList = new ArrayList<Commonent>();public void add(Commonent commonent){this.commonentList.add(commonent);}public void remove(Commonent commonent){this.commonentList.remove(commonent);}public List<Commonent> getCommonentsList(){return commonentList;}@Overridepublic void invokeMethod() {for(Commonent commonent : commonentList){commonent.invokeMethod();}}}

         Client(客户端)

         ----通过Component接口控制组合部件的对象

package com.ebuair.pattern.component;public class Client {public static void main(String[] args) {Commonent leaf1 = new Leaf();Commonent leaf2 = new Leaf();Composite commonent1 = new Composite();Composite commonent2 = new Composite();Commonent leaf3 = new Leaf();Commonent leaf4 = new Leaf();commonent1.add(leaf1);commonent1.add(leaf2);commonent2.add(commonent1);commonent2.add(leaf3);commonent2.add(leaf4);commonent2.invokeMethod();}}

b)      将管理子元素的方法定义在Component接口中,这样Leaf类就需要对这些方法空实现。

  组成:

         Component(抽象构件接口)

         ----为组合的对象声明接口

         ----在某些情况下爱实现从此接口派生的所有类共有的默认行为

         ----定义一个接口可以访问及管理它的多个子部件  

package com.ebuair.pattern.component;import java.util.List;public interface Commponent2 {public void invokeMethod();public void add(Commponent2commponent);public void remove(Commponent2 commponent);public List<Commponent2> getAllCommponent2();}

     Leaf(叶部件)

         ----在组合中表示叶节点对象,叶节点没有子节点

         ----定义组合中接口对象的行为

package com.ebuair.pattern.component;import java.util.List;public class Leaf2 implements Commponent2 {@Overridepublic void invokeMethod() {System.out.println("invoke method invoke!!!");}@Overridepublic void add(Commponent2 commponent) {}@Overridepublic void remove(Commponent2 commponent) {}@Overridepublic List<Commponent2> getAllCommponent2() {// TODO Auto-generated method stubreturn null;}}

        Composite(组合类)

   ----定义有子节点(子部件)的部件的行为

         ----存储子节点(子部件)

         ----在Component接口中实现与子部件相关的操作

package com.ebuair.pattern.component;import java.util.ArrayList;import java.util.List;public class Commposite2 implements Commponent2 {private List<Commponent2> leaf2List = new ArrayList<Commponent2>();@Overridepublic void invokeMethod() {for(Commponent2 leaf2 : leaf2List){leaf2.invokeMethod();}}@Overridepublic void add(Commponent2 commponent) {leaf2List.add(commponent);}@Overridepublic void remove(Commponent2 commponent) {leaf2List.remove(commponent);}public List<Commponent2> getAllCommponent2() {return leaf2List;}}

         Client(客户端)

         ----通过Component接口控制组合部件的对象

package com.ebuair.pattern.component;public class Client2 {public static void main(String[] args) {Commponent2 leaf1  = new Leaf2();Commponent2 leaf2  = new Leaf2();Commponent2 commponent1 = new Commposite2();Commponent2 commponent2 = new Commposite2();Commponent2 leaf3  = new Leaf2();Commponent2 leaf4  = new Leaf2();commponent1.add(leaf1);commponent1.add(leaf2);commponent2.add(commponent1);commponent2.add(leaf3);commponent2.add(leaf4);commponent2.invokeMethod();}}





 

b)      将管理子元素的方法定义在Component接口中,这样Leaf类就需要对这些方法空实现。
0 0
原创粉丝点击