追MM 之合成模式实现

这一周,MM 告诉我要我见一次家长。听说,他们家计划生育执行的很不好,人丁兴旺啊。她爷爷就有10 几个儿子,儿子每个儿子又有很多儿子,儿子也有很多儿子。 要我一口气记下来,不累死才怪。还好ME  我学会了合成模式。把所有对象之间的关系,组建成一个树。只要告诉某个人,我立刻可以遍历出她所有的儿子信息来。
 
抽象构件:
package composite;

public interface People {

   public People getSelf(); //返回自己的实例
   public String getName(); // 方便测试
   public void operator(); // 业务方法
}
 
树叶构件:
package composite;

public class Leaf implements People {

   private String name;
    
   public Leaf(String name){
     this.name = name;
  }
   public People getSelf() {
    
     return this;
  }

   public void operator() {
    

  }
   public String getName() {
     return name;
  }

}
 
3.树枝构件
package composite;

import java.util.Vector;

public class Composite implements People {
   private String name;
   private Vector<People>    sons =     new Vector<People>();
   public Composite(String name){
     this.name = name;
  }
    
   public People getSelf() {
     return this;
  }

   public void add(People son){
    sons.add(son);
  }
    
    
   public void operator() {
    
  }

   public Vector<People> getSons(){
     return sons;
  }

   public String getName() {
    
     return name;
  }
}
 
客户端
package composite;

import java.util.Enumeration;
import java.util.Vector;

public class Client {

   /**
    * @param args
    */
   public static void iteratorTree(Composite composite){
    Vector<People> sons = composite.getSons();
    Enumeration<People> enums = sons.elements();
     while(enums.hasMoreElements()){
      People son    =enums.nextElement();
       if(son instanceof Composite){
        Composite temp = (Composite)son;
        System.out.println(son.getName());
        iteratorTree(temp);
      } else{
        System.out.println(son.getName());
      }
       /*
        Composite temp = (Composite)son;//ClassCastException
        System.out.println(son.getName());
        iteratorTree(temp);
      */
    }
  }
   public static void main(String[] args) {

    Composite root = new Composite( "爷爷");
    
    Composite son1 = new Composite( "儿子1");
    Composite son2 = new Composite( "儿子2");
        
    People grandson11 = new Leaf( "孙子11");
    People grandson112 = new Leaf( "孙子12");
    
    root.add(son1);
    root.add(son2);
    
    son1.add(grandson112);
    son1.add(grandson11);
    
    iteratorTree(root);
  }

}
 
合成模式: 有两种方式,1.透明式合成模式、2安全式合成模式。
而以上代码 运用的是安全式合成模式。 因为 树枝构件 和树叶构件 虽然实现同一个接口,但是树枝却有很多自己客制化的方法。 如果树枝构件想访问那些方法,会在编译器过程中报错的,更谈不上运行时了。所以说来,是相对安全的。
 
另外一中透明式合成模式: 树叶构件和树枝构件拥有相同的方法,这些方法都是来自于抽象构件。说一说来,对于客户端来说,树叶构件和树枝构件都是一样的,没有区别。这势必造成了如果一个树叶对象,访问了树枝方法,具有危险性。

你可能感兴趣的:(职场,休闲,合成模式)