第五个设计模式:合成模式
合成模式把部分和整体关系用树结构表示,是属于对象的结构模式。合成模式要对组合的对象进行管理,所以在一定位置给予对象的相关管理方法,如:add(),remove()等.合成模式中对象的管理有两种方案。
1.安全方式:此方式只允许树枝构件有对象的管理方法。
2.透明方式:此方式只允许树枝和树叶都有对象的管理方法,但树叶对象中的管理方法无实际意义。
一.UML示意图
二.组成部分
抽象构件:抽象组合对象的公共行为接口
树叶构件:树叶对象,没有下级子对象
树枝构件:树枝对象,树枝对象可以包含一个或多个其他树枝或树叶对象
三.代码例子:我以一个超市购物为例
(一)、安全方式
1.抽象物品(抽象构件)
package com.eekq.structure.composite.security;
/*
* 抽象构件,物品
* */
public interface IRes {
/**购物买单,示意性的商业方法*/
public void pay();
}
2.单一物品(树叶构件)
package com.eekq.structure.composite.security;
public class SingleResImpl implements IRes {
/**物品名称*/
private String name;
/**价钱*/
private float money;
public SingleResImpl(String name, float money) {
this.name = name;
this.money = money;
}
public void pay() {
System.out.println("购买了一件物品["+getName()+"],价钱是[" + getMoney()+"]元");
}
public float getMoney() {
// TODO 自动生成方法存根
returnthis.money;
}
public String getName() {
// TODO 自动生成方法存根
return this.name;
}
/**重写equals*/
public boolean equals(Object obj){
SingleResImpl res = (SingleResImpl)obj;
return res.getName().equals(getName()) && res.getMoney()==getMoney();
}
}
3.多个物品(树枝构件)
package com.eekq.structure.composite.security;
import java.util.Iterator;
import java.util.Vector;
/*
* 对多个物品的管理
* */
public class MultiResImpl implements IRes {
/**购物车*/
private Vector car = new Vector();
private static float totle = 0.0f;
public void pay() {
if(!car.isEmpty()){
System.out.println("名称 价格\n");
shopping();
System.out.println("\n总价:" + totle + "元");
}else{
System.out.println("您好,你没有购买任何物品,不用买单!");
}
}
public void shopping() {
if (car != null || !car.isEmpty()) {
Iterator it = car.iterator();
SingleResImpl res = null;
Object temp = null;// 临时对象
while (it.hasNext()) {
temp = it.next();
if (temp instanceof MultiResImpl) {
((MultiResImpl) temp).shopping();
} else {
res = (SingleResImpl) temp;
synchronized (this) {
totle += res.getMoney();
}
System.out.println(res.getName() + " " + res.getMoney()
+ "元");
}
}
}
} /**加入新的物品*/
public void addRes(IRes res) {
car.add(res);
}
/**放回物品*/
public void removeRes(IRes res) {
car.remove(res);
}
}
4.收银台买单
package com.eekq.structure.composite.security;
public class Main {
/**
*@paramargs
*/
public static void main(String[] args) {
/**买支雪糕*/
IRes singleRes = new SingleResImpl("雪糕", 1.5f);
/**买单*/
singleRes.pay();
/**快过年了,我推了个购物车,多买点东西*/
IRes allRes = new MultiResImpl();
/**在一楼买的食物*/
IRes one = new MultiResImpl();
((MultiResImpl) allRes).addRes(one);//把一楼的东西装在购物车里
/**因为是安全方式的组合模式,因此不够透明,只能明确的向下转型,然后再加入购物车了*/
((MultiResImpl) one).addRes(new SingleResImpl("旺旺", 28.5f));
((MultiResImpl) one).addRes(new SingleResImpl("糖果", 38.0f));
((MultiResImpl) one).addRes(new SingleResImpl("可乐", 8.5f));
/**二楼去买的衣服和袜子*/
IRes two = new MultiResImpl();
((MultiResImpl) allRes).addRes(two);// 把二楼的东西装也装在购物车里
((MultiResImpl) two).addRes(new SingleResImpl("衣服", 130.5f));
((MultiResImpl) two).addRes(new SingleResImpl("袜子", 10f));
/**二楼再买了个手表,我放在bao里*/
IRes bao = new MultiResImpl();
((MultiResImpl) two).addRes(bao);//把购物小包装在二楼购物车里
((MultiResImpl) bao).addRes(new SingleResImpl("手表", 100f));
/**回到一楼,又买了苹果和梨*/
((MultiResImpl) one).addRes(new SingleResImpl("苹果", 10.0f));
((MultiResImpl) one).addRes(new SingleResImpl("梨", 3.0f));
/**在买单之前我把可乐退了,因为家里还有的嘛*/
((MultiResImpl) one).removeRes(new SingleResImpl("可乐", 8.5f));
/**在收银台一次性对购物车所有物品买单*/
allRes.pay();
}
}
5.运行结果
购买了一件物品[雪糕],价钱是[1.5]元
名称 价格
旺旺 28.5元
糖果 38.0元
苹果 10.0元
梨 3.0元
衣服 130.5元
袜子 10.0元
手表 100.0元
总价:320.0元
(二)、透明方式
透明方式与安全方式的不同点在于抽象构件,透明方式使用的是统一接口。
1. 抽象构件
package com.eekq.structure.composite.clarity;
/*
* 抽象构件,物品
* */
public interface IRes {
/**购物买单,示意性的商业方法*/
public void pay();
/**加入新的物品*/
public void addRes(IRes res);
/**放回物品*/
public void removeRes(IRes res);
}
2. 单一物品(树叶构件)
package com.eekq.structure.composite.security;
public class SingleResImpl implements IRes {
/**物品名称*/
private String name;
/**价钱*/
private float money;
public SingleResImpl(String name, float money) {
this.name = name;
this.money = money;
}
public void pay() {
System.out.println("购买了一件物品["+getName()+"],价钱是[" + getMoney()+"]元");
}
public float getMoney() {
// TODO 自动生成方法存根
return this.money;
}
public String getName() {
// TODO 自动生成方法存根
return this.name;
}
/**重写equals*/
public boolean equals(Object obj){
SingleResImpl res = (SingleResImpl)obj;
return res.getName().equals(getName()) && res.getMoney()==getMoney();
}
}
3.多个物品(树枝构件)
同安全模式代码一样!
4.收银台买单
package com.eekq.structure.composite.clarity;
public class Main {
/**
*@paramargs
*/
public static void main(String[] args) {
/**买支雪糕*/
IRes singleRes = new SingleResImpl("雪糕", 1.5f);
/**买单*/
singleRes.pay();
/**快过年了,我推了个购物车,多买点东西*/
IRes allRes = new MultiResImpl();
/**在一楼买的食物*/
IRes one = new MultiResImpl();
allRes.addRes(one);// 把一楼的东西装在购物车里
/**因为是透明方式的组合模式,因此直接调用就是了*/
one.addRes(new SingleResImpl("旺旺", 28.5f));
one.addRes(new SingleResImpl("糖果", 38.0f));
one.addRes(new SingleResImpl("可乐", 8.5f));
/**二楼去买的衣服和袜子*/
IRes two = new MultiResImpl();
allRes.addRes(two);// 把二楼的东西装也装在购物车里
two.addRes(new SingleResImpl("衣服", 130.5f));
two.addRes(new SingleResImpl("袜子", 10f));
/**二楼再买了个手表,我放在bao里*/
IRes bao = new MultiResImpl();
two.addRes(bao);// 把购物小包装在二楼购物车里
bao.addRes(new SingleResImpl("手表", 100f));
/**回到一楼,又买了苹果和梨*/
one.addRes(new SingleResImpl("苹果", 10.0f));
one.addRes(new SingleResImpl("梨", 3.0f));
/**在买单之前我把可乐退了,因为家里还有的嘛*/
one.removeRes(new SingleResImpl("可乐", 8.5f));
/**在收银台一次性对购物车所有物品买单*/
allRes.pay();
}
}
5.运行结果
同安全模式一样的结果!
四.总结
合成模式是对象的结构模式,以上演示合成模式。在以后的项目中,如果遇到对象组合的情况,即也符合树结构的。可以考虑下此模式。此模式中讲述了安全方式和透明方式。
安全方式:抽象构件上只提供树叶和树枝公共的方法,没提供树枝独有的管理等方法(add(),remove())。这样的好处是安全,用户不会在树叶上使用add()等管理方法,缺点是不够透明,用户必须知识当前对象为树叶还是树枝(向下转型)。
透明方式:抽象构件上提供了满足树枝的所有方法(包括add(),remove()),这样做的好处是,用户可以任意执行对象的add()和remove()管理对象。缺点是如果用户在树叶上执行管理方式(add(),remove())时,在编译期不会有错,但在执行期会报错,这样不容易被发觉错误出在哪.
作者:飞行鱼 QQ:6868861 推荐J2EE群:7715552
发表评论
-
什么是设计模式
2006-11-25 16:53 966用自己的话简单谈一下设计 模式。对于面向对象程序开发来说,不会 ... -
第一个设计模式:简单工厂
2006-11-25 17:21 1334第一个设计模式:简单工厂 UML示意图:<v:shape ... -
第二个设计模式:工厂方法
2006-12-13 22:16 1278上一节中已经介绍了简单工厂,我想大家应该有一定认识了。然后 ... -
第三个设计模式:策略模式
2006-12-17 10:08 2762今天给大家介绍第三个设计模式:策略模式 一.策略模式是对象 ... -
第四个设计模式:装饰模式
2006-12-19 21:21 2863第四个设计模式:装饰模式 装饰模式是对对象功能增强时,平时使用 ... -
第六个设计模式:模板方法
2007-01-17 23:57 1152第六个设计模式之:模板方法 模板方法模式主要是对大方法体细 ...
相关推荐
合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就 合成模式 是一个处理对象的树结构的模式。 合成模式把部分与整体的关系用树结构表示出来。 合成模 式使得客户端把一个个单独的...
第5章 合成(composite)模式 39 第6章 桥接(bridge)模式 52 第7章 职责型模式介绍 62 第8章 单例(singleton)模式 67 第9章 观察者(observer)模式 72 第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12...
3.1.1设计模式 3.1.2创建型模式概述 3.1.3简单工厂模式 3.1.4工厂方法模式 3.1.5抽象工厂模式 3.1.6建造者模式 3.1.7原型模式 3.1.8单例模式 3.2实训实例 3.2.1简单工厂模式实例之图形工厂 3.2.2工厂方法...
c) 合成一个新的字符图像后,新图像不会含有关于”合成过程”的信息,即新图像不知道是通过水平连接得到的,还是垂直连接得到的,也不会知道“左子图”是什么等。 为此,重新设计了CharPic(为方便对比,类名改为Pic)...
二、设计模式遵循的原则有6个: 1、开闭原则(Open Close Principle) 对扩展开放,对修改关闭。 2、里氏代换原则(Liskov Substitution Principle) 只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,...
第5章 专题 JAVA语言的接口 第6章 专题 抽象类 第7章 里氏代换原则 第8章 依赖倒转原则 第9章 接口隔离原则 第10章 合成、聚合复用原则 第11章 迪米特法则 第12章 简单工厂模式 第13章 工厂方法模式 第14章 抽象工厂...
第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象工厂模式 ...
第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 WebSnap的Web Module架构与抽象...
第5章 vcl深度探索 5.1 action开发之七种武器 5.2 vcl拖放高级应用 5.3 高级停靠技术的实现 5.4 面向对象的界面复用技术 5.5 vcl中的容器类 5.6 所见即所得的delphiweb开发利器--intraweb开发指南 5.7...
一、设计模式七大原则(有些地方使用六大原则,没有第六调,此处主要是总结,用于学习) 1、单一职责原则 一个类只负责一个功能领域中的相应职责 2、里氏替换原则 任何基类可以出现的地方,子类一定可以出现 3、依赖...
第5章 低噪声微波频率合成器的设计原理 5.1 微波环路的基本框图 5.2 微波环路中的加性噪声 5.3 用环路滤波器改善输出噪声 5.4 微波频率合成举例 5.4.1 超低噪声微波频率合成器 5.4.2 雷达和通信系统中的低噪声频率...
第5 章 专题:Java 语言的接口........59 5.1 什么是接口...................................59 5.2 为什么使用接口...........................60 5.3 Java 接口常见的用法...................63 第6 章 专题:...
第5章 低噪声放大电路设计 5.1 低噪声放大器设计理论基础 5.1.1 低噪声放大器在通信系统中的作用 5.1.2 低噪声放大器的主要技术指标 5.1.3 低噪声放大器的设计方法 5.2 LNA设计实例 5.2.1 下载并安装晶体管的库文件...
4 数据库关系图 第4章 数据库物理结构设计 第5章 数据库完整性设计 5。1 主键及唯一性索引 5.2 参照完整性设计 5.3 Check约束 5.5 触发器设计 第6章 数据库视图设计 第7章 数据库存储过程设计 第8章 权限设计 ...
260 DriveRack单元自出厂时就带有25个精心设计路径结构的厂家程序,它们完美的适合于任何扩声及固定安装应用。这些配置是以一种直观的直接的方法处于260上的。260显示出从输入部分至输出部分整个的信号路径。 ...
当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...
XXXXX 数字常规对讲机覆盖系统 无线覆盖设计方案 数字常规对讲机覆盖系统 技术方案 设计单位:武汉易达通科技发展有限公司 2015年7月 无线覆盖设计方案全文共10页,当前为第1页。 无线覆盖设计方案全文共10页,当前...
第5章 功率合成器、阻抗变换器和定向耦合器 5.1基本特性 5.2三口网络 5.3四口网络 5.4同轴电缆变换器和合成器 5.5 wilkinson功率分配器 5.6微波混合桥 5.7耦合线定向耦合器 参考文献 第6章 功率放大器设计基础 6.1...
第5章 低噪声放大电路设计 5.1 低噪声放大器设计理论基础 5.1.1 低噪声放大器在通信系统中的作用 5.1.2 低噪声放大器的主要技术指标 5.1.3 低噪声放大器的设计方法 5.2 LNA设计实例 5.2.1 下载并安装晶体管的库文件...