`
pzq821111
  • 浏览: 18555 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多
设计模式—Composite模式
< src="http://tech.ddvip.com/a_dir_d/title_bottom.js">
将对象组合成树形结构以表示“整体—部分”的层次结构。Composite模式使单个对象和组合对象的使用具有一致性。
< src="http://tech.ddvip.com/a_dir_d/ads_250x250.js"> < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"> < src="http://googleads.g.doubleclick.net/pagead/test_domain.js"> < type="text/javascript"> 今天开始学习Composite模式,首先让我们看一下它的定义:

  将对象组合成树形结构以表示“整体—部分”的层次结构。Composite模式使单个对象和组合对象的使用具有一致性。

  下面给出这个模式的结构图:

设计模式学习笔记(二十一)—Composite模式

  如果把Composite模式看成是树形结构的话,那么它主要角色有:

  1)树干角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作。

  2)树枝角色(Composite):树枝上有很多树干,树枝也是树干的一种。

  3)树叶角色(Leaf):树干上的树叶,也就是Component中的具体操作对象。

  说到Composite模式,让我想到以前项目中遇到的一个问题,做一个影视节目列表的树形结构,要求支持二级分类,由于当时还没接触过设计模式,这个东西让我搞了好久,才弄好。

  现在使用Composite模式来解决这个问题,简直太简单了,别说是二级了,N级都没问题。下面我就用Composite来实现它,代码如下:

import java.util.ArrayList;
  
abstract class MovieClass{//Component
public String name;
public ArrayList<MovieClass> list;
public abstract void add(MovieClass component);
public abstract void remove(MovieClass component);
public abstract void display();
}
class Program extends MovieClass{//Leaf
public Program(String name){
 this.name=name;
}
  
public void add(MovieClass component){
 
  System.out.println("you can't add component to a proagram object");
}
  
public void display() {
 System.out.println("----------"+name);
}
  
public void remove(MovieClass component) {
  System.out.println("you can't remove component to a proagram object");
}
}
class ConcreteMovieClass extends MovieClass{//Composite
  
public ConcreteMovieClass(String name){
 this.name=name;
 list=new ArrayList<MovieClass>();
}
public void add(MovieClass component) {
 list.add(component);
 
}
  
public void remove(MovieClass component) {
 if(list.contains(component)){
   list.remove(component);
 }
 
}
public void display(){
  System.out.println(name);
 for(MovieClass mc:list){
 mc.display();
  }
}
}
public class Client {
public static void main(String args[]){
 Program pro=new Program("大汉天子");
 Program pro2=new Program("贞观长歌");
 ConcreteMovieClass cmc=new ConcreteMovieClass("电视连续剧");//一级分类
 cmc.add(pro);
 cmc.add(pro2);
  Program pro3=new Program("满城尽带黄金甲");
 Program pro4=new Program("色戒");
  ConcreteMovieClass cmc2=new ConcreteMovieClass("最新影视");//一级分类
  cmc2.add(pro3);
 cmc2.add(pro4);
 Program pro5=new Program("越狱");
  Program pro6=new Program("英雄");
 ConcreteMovieClass secondCmc=new ConcreteMovieClass("热播美剧");//二级分类
 secondCmc.add(pro5);
  secondCmc.add(pro6);
 cmc2.add(secondCmc);//在一级分类(最新影视)下添加二级分类热播美剧
  ConcreteMovieClass root=new ConcreteMovieClass("root");
  root.add(cmc);
 root.add(cmc2);
 
 root.display();//显示节目列表
 
}
}

这个例子只是一个简单的模拟并不通用,在我们的实际应用中,节目的来源(也就是Leaf)基本上都是从数据中读出来放到一个 javabean中,我们不可能让这个bean来再来继承我们的(Component),至少绝大部分情况是这样,而且还要有很多操作要实现,如判断一个 component是否是单个对象还是一个对象的组合,这个对象是否有子节点(Component),父节点(Component)以及异常处理等等。实现一个树形菜单的通用程序并不是那么容易的事。由于大家对设计模式关注不是太高(我写了那么多设计模式的文章,连个拍砖的都没有,伤心。。。。。。),以后有时间我再补上。

  Composite模式优缺点及适用情况:

  1)优点:使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。

2)缺点:我觉得Leaf类完全不应该来实现Component,应为它基本只是使用一个显示的作用,不能进行其他的操作如添加、删除等,如果实现Component容易产生误操作。

  3)适用情况:比较适合做各种各样的树形菜单。
分享到:
评论

相关推荐

    C++ Composite模式

    23种设计模式之八(结构型模式)Composite模式

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 单最常用的设计模式入门,比如AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式等

    设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...

    C++设计模式课件20_Composite_组合模式.pdf

    C++设计模式课件20_Composite_组合模式.pdf

    Java设计模式之组合模式(Composite模式)介绍

    主要介绍了Java设计模式之组合模式(Composite模式)介绍,Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性,需要的朋友可以参考下

    RFC-browser:RFC查看器。 Singleton,Observer,MVC模式以及Command和Composite模式

    RFC浏览器在此RFC浏览器中,您可以: 在顶部的文本字段中按编号查找RFC 如果在顶部的文本字段中输入字符串,则按... 此外,通过Swing库了解Composite模式设计。技术领域Java摇摆汤参考书目抢先设计模式-O'Reilly Media

    设计模式精解-GoF 23种设计模式解析

    2.4 Composite模式 2.5 Flyweight模式 2.6 Facade模式 2.7 Proxy模式 3 行为模式.....55 3.1 Template模式 3.2 Strategy模式 3.3 State模式 3.4 Observer模式 3.5 Memento模式 3.6 Mediator模式 3.7 Command模式...

    36种最新设计模式整理

    Design Pattern: Composite 模式 40 Design Pattern: Decorator 模式 41 Design Pattern: Facade 模式 44 Design Pattern: Flyweight 模式 46 Design Pattern: Proxy 模式(一) 48 Design Pattern: Proxy 模式(二...

    二十三种设计模式【PDF版】

    设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素,别人和你做买卖,相当于 和单位做买卖。文章中还对 Jive再进行了剖析。 设计模式之 Decorator(装饰...

    设计模式在地图制图软件开发中的应用

    摘要:数字地图制图实际上是...文中从数字地图制图软件的需求出发,对制图软件设计中常用设计模式(包括MVC模式、OBSERVER模式、COMPOSITE模式、COMMAND模式)的一般原理和结构进行简要介绍,并通过实例进行具体的说明。

    C#设计模式.PDF

    九、 一个实际应用Composite模式的例子 98 C#设计模式(12)-Decorator Pattern 101 一、 装饰(Decorator)模式 101 二、 装饰模式的结构 102 三、 装饰模式示例性代码 103 四、 装饰模式应当在什么情况下使用 106...

    C#设计模式大全

    九、 一个实际应用Composite模式的例子 C#设计模式(12)-Decorator Pattern 一、 装饰(Decorator)模式 二、 装饰模式的结构 三、 装饰模式示例性代码 四、 装饰模式应当在什么情况下使用 五、 装饰模式...

    敏捷软件开发:原则、模式与实践

    第23章 COMPOSITE模式 第24章 OBSERVER模式—回归为模式 第25章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第26章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第27章 案例研究:气象站 第六部分 ETS...

    设计模式之组合模式(Composite Pattern)

    将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。

    Composite.rar

    设计模式中的Composite模式,VC源码Composite.rar,希望我能把23个模式写全,O(∩_∩)O~

    ASP.NET设计模式-杨明军译(源码)

    5.2.2 Composite模式 5.2.3 Layer Supertype模式 5.3 应用设计原则 5.3.1 依赖倒置原则和依赖注入模式 5.3.2 接口分离原则 5.3.3 里氏替换原则 5.4 小结 第6章 服务层 6.1 服务层介绍 6.1.1 SOA 6.1.2 ...

    敏捷软件开发:原则、模式与实践.pdf

    第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式 第二十六章 PROXY模式和STAIRWAY TO HEAVEN模式:管理第三方API 第二十七章 案例研究:...

    C#23种设计模式_示例源代码及PDF

    ”“……”,MM 都会用 Composite 模式了,你会了没有? 合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就 合成模式 是一个处理对象的树结构的模式。 合成模式把部分与整体的...

    敏捷软件开发原则、模式与实践 C#版

    第26章 薪水支付案例研究:第一次迭代开始 第27章 薪水支付案例研究:实现 第四部分 打包薪水支付系统 第28章 包和组件的设计原则 第29章 FACTORY模式 第30章 薪水支付案例研究:包分析 第31章 COMPOSITE模式 第32章...

    Java Bug模式详解

    第9章 Dangling Composite模式 9.1 Dangling Comp osite bug模式简述 9.1.1 症状 9.1.2 起因 9.1.3 解决方法和预防 措施 9.2 小结 第10章 Null Flag模式 10.1 Null Flag bug模式简述 10.1.1 症状 10.1.2 ...

Global site tag (gtag.js) - Google Analytics