设计模式之第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. April 14 2017 Week 15 Friday

    Try to be a rainbow in someone's cloud. 当乌云萦绕心头,我愿意成为你的彩虹. Actually there are many rainbows in our l ...

  2. 关于定义顺序和内存分配的关系--记一道不严谨的C语言题

    include<stdio.h> #include<iostream> int main() { char a[] = "123"; char b[] = ...

  3. innerHTML动态添加html代码和脚本兼容性问题处理方法

    给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...

  4. LayoutParams布局

    AbsoluteLayout.LayoutParams可以重新设置坐标,然后调用setLayoutParamsLinearLayout.LayoutParams可以调用setMargins();来移动 ...

  5. CCF CSP 201712-2 游戏

    题目链接:http://118.190.20.162/view.page?gpid=T67 问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐 ...

  6. OnCollisionEnter和OnTriggerEnter

    之前对这两个的用法不是特别清楚,重新学习了下,再做个测试看看效果如何: 1.新建一个场景test 2.添加一个cube,点击Inspector面板会发现系统已经默认添加了Box collisder组件 ...

  7. System.Web.Caching.Cache

    此类是利用缓存来保存信息的.可以把一些稳定的数据,不会随用户而改变的信息利用Cache保存起来,可以优化网站的速度. Cache辅助类已上传:GitHub Cache和Session,cookie的区 ...

  8. How good are detection proposals, really?

    How good are detection proposals, really? J. Hosang, R. Benenson, B. Schiele Oral at BMVC 2014 http: ...

  9. javascript入门笔记2-window

    1.JavaScript-输出内容(document.write) <script type="text/javascript"> document.write(&qu ...

  10. orale 10g和11g中的自动统计任务

    orale 10g和11g中的自动统计任务 博客分类:  数据库相关/oracle   1)  先来看下oracle 10g中的自动统计任务的问题. 从Oracle Database 10g开始,Or ...