追MM 之合成模式实现

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dba10g.blog.51cto.com/764602/230210
这一周,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安全式合成模式。
而以上代码 运用的是安全式合成模式。 因为 树枝构件 和树叶构件 虽然实现同一个接口,但是树枝却有很多自己客制化的方法。 如果树枝构件想访问那些方法,会在编译器过程中报错的,更谈不上运行时了。所以说来,是相对安全的。
 
另外一中透明式合成模式: 树叶构件和树枝构件拥有相同的方法,这些方法都是来自于抽象构件。说一说来,对于客户端来说,树叶构件和树枝构件都是一样的,没有区别。这势必造成了如果一个树叶对象,访问了树枝方法,具有危险性。

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/230210

相关文章
|
7月前
镜头焦距改为3.5mm
镜头焦距改为3.5mm
32 0
|
9月前
【错题集-编程题】dd爱框框(同向双指针 / 滑动窗口)
【错题集-编程题】dd爱框框(同向双指针 / 滑动窗口)
|
9月前
|
算法 测试技术 C#
【分类讨论】【割点】1568. 使陆地分离的最少天数
【分类讨论】【割点】1568. 使陆地分离的最少天数
|
9月前
|
算法 Java API
算法编程(二十四):日期之间隔几天
算法编程(二十四):日期之间隔几天
88 0
|
传感器
有刷无刷,永磁同步,步进,空心杯,统统拆开看看有什么不同
有刷无刷,永磁同步,步进,空心杯,统统拆开看看有什么不同
成信大ENVI_IDL第二周课后作业:提取n个点的气溶胶厚度+详细解析
成信大ENVI_IDL第二周课后作业:提取n个点的气溶胶厚度+详细解析
120 0
|
前端开发 Java 程序员
一个由“ YYYY-MM-dd ”引发的惨案 元旦来临前警惕
前言 在元旦假期到来之际,我刚好准备出去飘几天,然而在使用一些 App 的时候,竟然被我发现了一个应该是由于前端粗心而导致的 bug,在 2019.12.30 出发,结果 App 上显示的是 2020.12.30(吓得我以为我的订单下错了,此处是不是该把程序员拉去祭天了)。 鉴于可能会有程序员因此而被拉去祭天,而我以前学 Java 的时候就有留意过这个问题,所以我还是把这个问题拿出来说一下,希望能尽量避免这方面的粗心大意(毕竟这种问题也很难测出来)。
127 0
一个由“ YYYY-MM-dd ”引发的惨案 元旦来临前警惕
|
算法 前端开发
有效的回旋镖
🎈每天进行一道算法题目练习,今天的题目是“有效的回旋镖”。
138 0
LeetCode题库1736求解隐藏最晚时间
LeetCode题库1736求解隐藏最晚时间
106 0

热门文章

最新文章