设计模式学习笔记(二十一)—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)适用情况:比较适合做各种各样的树形菜单。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Powerbuilder 9.0实用教程》源代码 1.本源代码包括以下章节源代码: 第01章 认识PowerBuilder 9.0、第05章 创建应用程序、第06章 创建窗体、第07章 创建菜单和工具栏、第10章 应用程序的调试和发布、第11章 典型小型实例赏析、第12章 图书管理系统实例和第13章 学生选课系统实例。 2.源代码使用方法参见《附录A 源代码的使用方法》文件。 __________________________________________________________________ 注意: 1.建议读者下载源文件后,将该源文件进行备份,读者使用副本源文件进行学习,这样一但出问题就不用再从网上下载了。 2.将源文件中“数据库文件”文件夹一定要复制到C盘根目录下,这样才能保证您连接数据库文件成功,具体方法参见《附录A 源代码的使用方法》。 对于书中源代码除了数据库外其他都能正常使用,而示例中数据库需要用户在自己的计算机上注册后才能使用,如果不注册数据源就运行应用程序是检索不到任何数据的,下面以连接学生选课系统数据库为例具体介绍如何连接数据库文件。 第1章 认识PowerBuilder 9.0 1 1.1 PowerBuilder 9.0简介 1 1.1.1 中国软件业现状 1 1.1.2 为什么要学习PowerBuilder 9.0 2 1.1.3 PowerBuilder的概述 2 1.1.4 PowerBuilder的特点 3 1.1.5 PowerBuilder 9.0的新特性 6 1.2 安装PowerBuilder 9.0软硬件需求 9 1.2.1 软件环境需求 9 1.2.2 硬件环境需求 9 1.3 PowerBuilder 9.0功能界面介绍 10 1.3.1 PowerBuilder 9.0界面简介 10 1.3.2 常用功能菜单 10 1.4 工作环境设置 16 1.4.1 工具栏的设置 16 1.4.2 窗口排列 19 1.4.3 快捷键设置 20 1.4.4 系统选项设置 21 1.5 用5分钟制作一个简单实例 22 1.5.1 实例运行界面 22 1.5.2 新建一个工作空间对象 22 1.5.3 新建一个应用程序对象 23 1.5.4 创建窗体 23 1.5.5 为应用程序添加open事件代码 25 1.6 小结 27 1.7 习题 27 第2章 编程基础知识 28 2.1 PowerScript脚本语言书写规则 28 2.1.1 忽略大小写 28 2.1.2 语句的断行、续行和分割 28 2.1.3 注释 29 2.2 数据类型 29 2.3 变量和作用域 30 2.3.1 定义变量 30 2.3.2 引用变量 30 2.3.3 变量的作用域 30 2.4 操作符 31 2.5 标识符 32 2.5.1 标识符的构成 32 2.5.2 匈牙利命名法 32 2.6 常用代词 33 2.7 控制语句 34 2.7.1 判断语句 34 2.7.2 循环语句 36 2.8 结构 38 2.8.1 创建结构 38 2.8.2 使用结构 40 2.9 函数 40 2.9.1 Open()和Close()函数 41 2.9.2 MessageBox()函数 41 2.9.3 类型转换函数 41 2.9.4 类型判断函数 42 2.9.5 其他函数 42 2.10 ODBC数据源与专用数据库接口 43 2.10.1 什么是ODBC数据源 43 2.10.2 专用数据库接口 43 2.10.3 连接数据库 44 2.10.4 配置ODBC 48 2.11 SQL语言 49 2.11.1 SQL语言的格式 49 2.11.2 在PowerBuilder 9中使用SQL语句 51 2.12 类和对象的概念 56 2.12.1 继承 57 2.12.2 重载和多态性 57 2.12.3 封装 57 2.12.4 属性、事件和函数 57 2.13 在PowerBuilder 9.0中实现面向对象编程 58 2.13.1 创建对象 58 2.13.2 设置对象属性 59 2.13.3 编写事件代码 59 2.13.4 实现继承对象 60 2.14 用户对象和用户事件 61 2.14.1 用户对象分类 61 2.14.2 定义用户对象 62 2.14.3 使用用户对象 64 2.14.4 用户事件 66 2.15 小结 67 2.16 习题 68 第3章 创建数据库 69 3.1 数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值