结构型开发模式-组合模式

模式动机

组合模式描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无需对他们进行区分,可以一致的对待容器对象和叶子对象,这就是组合模式的模式动机。

模式结构

  • Component: 抽象结构
  • leaf: 叶子结构
  • Composite: 容器结构
  • Client: 客户端

组合模式实例与解析

实例:水果盘

在水果盘(Plate)中有一些水果,如苹果(Apple)、香蕉(Banana)、梨子(Pear),当然大水果盘中还可以有小水果盘,现需要对盘中的水果进行遍历(吃),当然如果对一个水果盘执行“吃”方法,实际上就是吃其中的水果。

抽象结构

 public abstract class MyElement {
     public abstract void eat();
    }

叶子结构

public class Apple extends MyElement{
     public void eat(){
       System.out.peintln("eat apple !");
     }
   }
   
public class Pear extends MyElement {
    public void eat(){
         System.out.println("eat pear !");
    }
}
public class Banana extends MyElement{
    public void eat(){
        System.out.println("eat banana !");
    }
}   

容器结构

public class Plate extends MyElement{
     private ArrayList list = new ArrayList();
     public void add(MyElement element)
         list.add(element);
     }
     public void delete(MyElement element{
        list.delete(element);
     }
     
     public void eat(){
          for(Object obj: list){
              ((MyElement)obj).eat();
          }   
     }
}

客户端

pubic class Client{
    public static void main(String[] args{
       MyElement obj1, obj2, obj3, obj4, obj5;
       Plate plate1, plate2, plate3;
       obj1 = new Apple();
       obj2 = new Pear();
       plate1 = new Plate();
       plate1.add(obj1);
       plate2.add(obj2);
       
       obj3 = new Banana();
       obj4 = new  Banana();
       plate2 = new Plate();
       plate2.add(obj3);
       plate2.add(obj4);
       
       obj5 = new Apple();
       plate3 = new Plate();
       
       plate3.add(plate1);
       plate3.add(plate2);
       plate3.add(obj5);
       
       plate3.eat();
    }
}

模式试用环境

  • 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们。
  • 让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节。
  • 对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。

你可能感兴趣的:(结构型开发模式-组合模式)