- 浏览: 1205876 次
- 性别:
- 来自: 荆州
文章分类
- 全部博客 (396)
- Android 基础 (72)
- Java 基础 (42)
- Android(动画效果) (26)
- Android(自定义组件) (13)
- Android(手机服务) (38)
- Android(网络相关) (27)
- Android(多媒体) (12)
- Android(小技巧) (30)
- Android(用户界面) (39)
- 基础概念 (24)
- Android组件学习 (21)
- Android数据库相关 (11)
- 生活杂谈 (10)
- 调试技巧部分 (8)
- Sql Server相关 (1)
- Android(xml相关) (2)
- Android 开发 (12)
- 韩语学习 (4)
- Mac添加环境变量的三种方法 (1)
- iPhone开发 (1)
- Android Studio (1)
最新评论
-
ppfbsar:
下载网络文件到SD卡上 -
851228082:
好文!彻底理解单类型导入与按需导入的区别了。还有一点可以通过 ...
谈java的导入(import) -
麦田的设计者:
老乡啊
sqlite 数据库保存图片 -
sf_dream:
我要是读写list、map之类的集合呢
ObjectOutputStream和ObjectInputStream类的学习 -
xfyunyun:
博主,请问webview加载html字符串时怎么进行缓存处理呢 ...
WebView使用总结2(加载HTML内容形式的String)
Composite模式定义:
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
Composite模式理解:
想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。
Composite模式好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码
如何使用:
Step 1:
首先定义一个接口或抽象类(设计模式通用方式),其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体对象的方法.
Step 2:
以抽象类或接口的方式定义一个供继承或实现的类或接口:
这个抽象类定义的就是一个组合体内所有对象都具有的共同方法和属性。
Step 3:
下面接着定义组合体内原件对象的实体类:
Disk是组合体内的一个对象,或称一个部件,这个部件是个单独元素( Primitive)。还有一种可能是,一个部件也是一个组合体,就是说这个部件下面还有'儿子',这是树形结构中通常的情况,应该比较容易理解。
Step 4:
现在我们在继续定义一个组合体:
上面CompositeEquipment继承了Equipment,同时为自己里面的对象们提供了外部访问的方法,重载了Iterator,Iterator是Java的Collection的一个接口,是Iterator模式的实现.
Step 5:
我们在继续创建CompositeEquipment的两个具体类:盘盒Chassis和箱子Cabinet,箱子里面可以放很多东西,如底板,电源盒,硬盘盒等;盘盒里面可以放一些小设备,如硬盘 软驱等。无疑这两个都是属于组合体性质的。
至此我们完成了整个Composite模式的架构。
Step 6:
现在我们来看一下组合模式的使用场景:
上面调用的方法netPrice()或discountPrice(),实际上Composite使用Iterator遍历了整个树形结构,寻找同样包含这个方法的对象并实现调用执行.
Composite是个很巧妙体现智慧的模式,在实际应用中,如果碰到树形结构,我们就可以尝试是否可以使用这个模式。
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
Composite模式理解:
想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。
Composite模式好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码
如何使用:
Step 1:
首先定义一个接口或抽象类(设计模式通用方式),其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体对象的方法.
Step 2:
以抽象类或接口的方式定义一个供继承或实现的类或接口:
import java.util.Iterator; public abstract class Equipment { private String name; public Equipment(String name) { this.name = name; } // 实体价格 public abstract double netPrice(); // 折扣价格 public abstract double discountPrice(); // 增加部件的方法 public boolean add(Equipment equipment) { return false; } // 移除部件方法 public boolean remove(Equipment equipment) { return false; } // 组合体内访问各个部件的方法. public Iterator iter() { return null; } }
这个抽象类定义的就是一个组合体内所有对象都具有的共同方法和属性。
Step 3:
下面接着定义组合体内原件对象的实体类:
public class Disk extends Equipment { // 硬盘实体价格 public static double diskNetPrice = 2.0; // 硬盘折扣价格 public static double diskDiscountPrice = 1.0; public Disk(String name) { super(name); } @Override public double netPrice() { return diskNetPrice; } @Override public double discountPrice() { return diskDiscountPrice; } }
Disk是组合体内的一个对象,或称一个部件,这个部件是个单独元素( Primitive)。还有一种可能是,一个部件也是一个组合体,就是说这个部件下面还有'儿子',这是树形结构中通常的情况,应该比较容易理解。
Step 4:
现在我们在继续定义一个组合体:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; public abstract class CompositeEquipment extends Equipment { private int i = 0; // 定义一个List,用来保存组合体内的各个子对象. private List<Equipment> equipment = new ArrayList<Equipment>(); public CompositeEquipment(String name) { super(name); } public boolean add(Equipment equipment) { if (equipment instanceof Disk && this instanceof Chassis) { System.out.println("在盘盒里面放了一个硬盘"); } else if (equipment instanceof Chassis && this instanceof Cabinet) { System.out.println("在柜子里面放了一个盘盒"); } this.equipment.add(equipment); return true; } public double netPrice() { double netPrice = 0.; if (this instanceof Cabinet) { System.out.println("我是在柜子的组合对象里面.柜子本身价格为:" + Cabinet.cabinetNetPrice); } else if (this instanceof Chassis) { System.out.println("我是在盘盒的组合对象里面.盘盒本身价格为:" + Chassis.chassisNetPrice); } Iterator<Equipment> iter = equipment.iterator(); while (iter.hasNext()) { Equipment equipment = (Equipment) iter.next(); if (equipment instanceof Chassis) { System.out.println("在柜子里面发现一个盘盒,计算它的价格"); } else if (equipment instanceof Disk) { System.out.println("在盘盒里面发现一个硬盘,计算它的价格"); System.out.println("硬盘本身价格为:" + Disk.diskNetPrice); } netPrice += equipment.netPrice(); } return netPrice; } public double discountPrice() { double discountPrice = 0.; Iterator<Equipment> iter = equipment.iterator(); while (iter.hasNext()) { discountPrice += ((Equipment) iter.next()).discountPrice(); } return discountPrice; } // 这里提供用于访问自己组合体内的部件方法。 // 上面Disk之所以没有,是因为Disk是个单独(Primitive)的元素. public Iterator iter() { return equipment.iterator(); } // 重载Iterator方法 public boolean hasNext() { return i < equipment.size(); } // 重载Iterator方法 public Object next() { if (hasNext()) return equipment.get(i++); else throw new NoSuchElementException(); } }
上面CompositeEquipment继承了Equipment,同时为自己里面的对象们提供了外部访问的方法,重载了Iterator,Iterator是Java的Collection的一个接口,是Iterator模式的实现.
Step 5:
我们在继续创建CompositeEquipment的两个具体类:盘盒Chassis和箱子Cabinet,箱子里面可以放很多东西,如底板,电源盒,硬盘盒等;盘盒里面可以放一些小设备,如硬盘 软驱等。无疑这两个都是属于组合体性质的。
public class Cabinet extends CompositeEquipment { public static double cabinetNetPrice = 10.0; public static double cabinetDiscountPrice = 5.0; public Cabinet(String name) { super(name); } // 柜子本身价格以及放在柜子里面盒子的价格. public double netPrice() { return cabinetNetPrice + super.netPrice(); } public double discountPrice() { return cabinetDiscountPrice + super.discountPrice(); } } public class Chassis extends CompositeEquipment { public static double chassisNetPrice = 2.0; public static double chassisDiscountPrice = 1.0; public Chassis(String name) { super(name); } // 盒子的价格以及盒子里面硬盘价格. public double netPrice() { return chassisNetPrice + super.netPrice(); } // public double discountPrice() { return chassisDiscountPrice + super.discountPrice(); } }
至此我们完成了整个Composite模式的架构。
Step 6:
现在我们来看一下组合模式的使用场景:
public class Client { public static void main(String[] args) { Cabinet cabinet = new Cabinet("柜子"); Chassis chassis = new Chassis("盘盒"); // 将盘盒装到箱子里 cabinet.add(chassis); // 将硬盘装到盘盒里 chassis.add(new Disk("硬盘")); // 查询整个柜子的实体价格 System.out.println("整个柜子的实体价格(包括里面的盘盒和硬盘) =" + cabinet.netPrice()); // 查询整个柜子的折扣价格 System.out.println("整个柜子的折扣价格(包括里面的盘盒和硬盘) =" + cabinet.discountPrice()); } }
上面调用的方法netPrice()或discountPrice(),实际上Composite使用Iterator遍历了整个树形结构,寻找同样包含这个方法的对象并实现调用执行.
Composite是个很巧妙体现智慧的模式,在实际应用中,如果碰到树形结构,我们就可以尝试是否可以使用这个模式。
发表评论
-
ArrayList添加add方法效率
2013-05-09 19:24 1533public static void main(Strin ... -
HashMap用法熟悉
2012-11-11 23:43 1374HashMap排列没有按一定规则示例代码: public ... -
谈java的导入(import)
2012-06-10 16:53 1678单类型导入(single-type-import),例如imp ... -
TCP和UDP协议理解
2011-12-04 21:32 1412我们学习过什么是 ... -
华为的一道面试题
2011-11-01 10:26 1596代码如下: package com.ex; publ ... -
Java中静态变量的初始化问题
2011-10-24 11:04 10737/** * java中的内存有一块地址叫"静态代 ... -
Java引用了解
2011-10-16 16:29 1157正常来说,传统的JAVA引用,如 public ... -
Java中的抽象类和接口的区别
2011-08-21 08:47 1124Java语言中, abstract class 和in ... -
谈谈final, finally, finalize的区别
2011-08-20 10:37 1229final—修饰符(关键字)如果一个类被声明为fi ... -
Java中重载和重写的区别
2011-08-20 10:17 1089这个问题已经研究了好多遍了,总是忘记,就整理下来加深印象: ... -
Hashtable和HashMap
2011-08-20 09:55 10822者概念: Hashtable继承自Dictionary类 ... -
Java中HashCode()理解
2011-08-20 09:42 1078先从一个java基础面试的问题开始引入吧: 问题: 两个对象值 ... -
java继承复习
2011-07-24 14:30 838package com.edison; public ... -
Java多态机制中的绑定规则
2011-07-23 10:25 1504package com.example; publi ... -
java接口进一步理解(二)
2011-07-23 09:54 1062抽象类与接口比较: 1.抽象类与接口都位于继承树的上层 相 ... -
java接口进一步理解(一)
2011-07-23 09:47 1264今天来整理篇关于java接口知识的文章: 首先我们知道 ... -
SimpleDateFormat的常用方法
2011-07-22 10:17 1090/** parse()可以 把String型的字符串转换成 ... -
内部类使用总结(参考白度文献上的文章)
2011-07-21 22:00 1103我是一个java基础不太好 ... -
线程和Runnable接口的理解
2011-06-21 11:59 1165通过卖票来进行解释: 1.ThreadTicket.java: ... -
数组相同元素清理(HashSet)
2011-06-10 13:05 1315import java.util.Arrays; impor ...
相关推荐
设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of ...
主要为大家详细介绍了java设计模式之组合模式Composite,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...
组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任...
主要介绍了Java设计模式之组合模式(Composite模式)介绍,Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性,需要的朋友可以参考下
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...
java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...
Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ...
把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。就像是图书管理员对图书馆的书籍进行整理,既可以对每一部分...容器(Composite)构建角色:有容器的特征,可以包含子节点。
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...
11.组合模式(Composite) 8 12.享元模式(Flyweight) 9 13.模板模式 9 13、策略模式(strategy) 12 14、模板方法模式(Template Method) 13 15、观察者模式(Observer) 14 16、迭代子模式(Iterator) 16 17、...
15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式
2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)。3、行为模式:Iterator(迭代模式)、Template(模板...
11. 组合模式 (Composite Pattern) 12. 装饰者模式 (Decorator Pattern) 13. 访问者模式 (Visitor Pattern) 14. 迭代器模式 (Iterator Pattern) 15. 享元模式 (Flyweight Pattern) 16. 桥接模式 (Bridge ...
23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...
Java设计模式 (含有相关源码) Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Adapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能...
2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5...
java ...组合模式(compositePattern) 装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter
策略模式【STRATEGY PATTERN】 代理模式【PROXY PATTERN】 单例模式【SINGLETON PATTERN】 多例模式【MULTITION PATTERN】 工厂方法模式【FACTORY METHOD ...组合模式【COMPOSITE PATTERN】 ......