设计模式之第22章-组合模式(Java实现)

  “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊。”“当然”“没有?”“有啊。别急,一会人就到了。”

组合模式之自我介绍

  “请问你是?怎么什么都不说就直接上来了。”“本式行不更名坐不改姓,就是组合模式来着,此次受作者之邀来讲讲我的前世今生来着。”“哦,你就是组合模式啊,久仰久仰。”“失敬失敬。”恩,首先我先说下定义:Compose objects into tree structure to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.就是说将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合的使用具有一致性。我的通用类图如下所示:

  

  用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求,如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。

组合模式之自我分析

  优点:

  • 定义了包含基本对象和组合对象的类的层次结构。基本对象可以被组合成更复杂的组合对象,这个组合又会被组合,不断递归下去。
  • 简化客户代码。客户可以一致的使用组合结构和单个对象。
  • 使得更容易增加新增类型的组件。  

  缺点:

  • 很难限制组合中的组件。有时希望一个组合只能有某些特定组件。使用Composite时,不能依赖类型系统施加这些约束,而必须要在运行时刻进行检查。

组合模式之实现

  实现这么简单的事还需要举栗子么?(PS:别废话,这个东西是赖不掉的,想当年工厂方法和抽象工厂夫妻俩就没赖掉。)那个好吧,我就举个栗子以便于理解:

  首先是抽象的Component类: 

 public abstract class Component{
//部分与整体共享的方法
public void doSth(){ }
}

  接下来是继承自树枝的类的实现,里面包含增加、删除以及获得分支下所有的叶子或分支组件的方法,代码如下:

 public class Composite extends Component{
//Component容器
private ArrayList<Component> compList = new ArrayList<>();
//增加叶子/树枝节点
public void add (Component component){
this.compList.add(component);
} //删除叶子/树枝节点
public void remove(Component component){
this.compList.remove(component);
} //获得分支下所有的叶子/分支Component
public ArrayList<Component> getChildren(){
return this.compList;
}
}

  叶子节点的实现方法:

 public class Leaf extends Component{

 }

  组合模式就这么简单的实现了。为表诚意,我再实现个场景类来说明如何调用这些个方法:  

 public class Client{
public static void main(String[] args) {
//创建根节点
Composite root = new Composite();
root.doSth();
//创建一个树枝
Composite branch = new Composite();
//创造叶子
Leaf leaf = new Leaf();
//组合
root.add(branch);
branch.add(leaf);
}
}

  此类中,显示创建根节点,然后是树枝,最后是叶子,然后这些被组合成树。就此结束。

组合模式之应用场景

  • 表示整体-部分的层次结构。
  • 希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。

  好了,设计模式之23式至此完结。撒花,撤走~撒有那拉,米娜。

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.net

  <。)#)))≦

设计模式之第22章-组合模式(Java实现)的更多相关文章

  1. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  2. 设计模式之第9章-原型模式(Java实现)

    设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...

  3. 设计模式之第7章-外观模式(Java实现)

    设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...

  4. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  5. 设计模式之第20章-访问者模式(Java实现)

    设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...

  6. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  7. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  8. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  9. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

随机推荐

  1. 显示、更改ubuntu linux主机名(计算机名)

    在bash中输入hostname可以显示计算机名.Linux和windows都可以使用这条指令. 主机名保存在/etc/hostname文件中 需要进入Root权限才可以修改该文件. sudo ged ...

  2. Arduino-定义串口

    在一个老外写的代码中找到了一个非常好的定义串口的方法!   Arduino用下面这种方法定义串口可以方便的把协议应用的任意的端口,大大提高了代码的修改性和移植性.       以下是范例:       ...

  3. ABI是编译器的开发指南

    http://blog.csdn.net/soaringlee_fighting/article/details/70214785 1) ABI: 二进制应用程序接口(Application Bina ...

  4. 剑指offer 和为s的两个数字的调试

    这是整个调试, for (int i:s) cout<<i<<endl;这句话是c++11特性下的一种遍历方式 在编译的时候需要加-std=c++11,即g++ 41.cpp ...

  5. 删除已有的 HTML 元素

    如需删除 HTML 元素,您必须首先获得该元素的父元素: 实例 <div id="div1"> <p id="p1">这是一个段落.&l ...

  6. virtual base classes

    virtual base classes用来实现菱形继承解决多个重复subobject的问题 //: C09:VirtualBase.cpp // Shows a shared subobject v ...

  7. Windows/Linux下查看系统CPU使用最高的线程

    参考:https://blog.csdn.net/qq_27818157/article/details/78688580 jstack -l 31372 > c:/31372.stack

  8. C/C++程序基础 (十)模板和泛型

    什么是泛型编程 基于模板,有效将算法和数据结构分离. 模板 包括类型和参数 模板函数:抽象的函数定义,代表一类同构函数.编译器在其调用位置自动完成对应模板函数的实例化. 模板类:抽象的类定义,代表更高 ...

  9. 「译」setState如何知道它该做什么?

    本文翻译自:How Does setState Know What to Do? 原作者:Dan Abramov 如果有任何版权问题,请联系shuirong1997@icloud.com 当你在组件中 ...

  10. spring-mvc.xml的定时器配置

    <!-- 设置时间 --> <bean id="myJobTrigger" class="org.springframework.scheduling. ...