设计模式学习笔记--合成(Composite)模式(一)

2014-11-23 23:41:22 · 作者: · 浏览: 2



写在模式学习之前


什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式;每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案;当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。

设计模式就是抽象出来的东西,它不是学出来的,是用出来的;或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以“模式专家”的角度来看,都是最佳的设计,不得不说是“最佳的模式实践”,这是因为你积累了很多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。

有人说:“水平没到,学也白学,水平到了,无师自通”。诚然,模式背熟,依然可能写不出好代码,更别说设计出好框架;OOP理解及实践经验到达一定水平,同时也意味着总结了很多好的设计经验,但"无师自通",却也未必尽然,或者可以说,恰恰是在水平和经验的基础上,到了该系统的学习一下“模式”的时候了,学习一下专家总结的结果,印证一下自己的不足,对于提高水平还是很有帮助的。

本系列的设计模式学习笔记,实际是对于《Java与模式》这本书的学习记录。


合成(Composite)定义


合成(Composite)模式,有时又叫做部分-整体(Part-Whole)模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。

结构图:

vcn5w/fX07bUz/O1xLncwO2w7Leoo6y/ydLU0aHU8bXE09DI58/Cwb3W1qO6PC9wPgo8cD48c3Ryb25nPs24w/e3vcq9o7o8L3N0cm9uZz7U2iBDb21wb21lbnQgyfnD98v509C3vbeoo6y6w7SmysfL+dPQubm8/r3Tv9rP4M2so6zIsbXjyseyu7m7sLLIq6Os0vLOqtK219O92rXjus3K99amvdq148rH09DH+LHwtcSjrNK219O92rXjsrvE3NPQz8LSu7j2suO0zrbUz/OhozwvcD4KPHA+PHN0cm9uZz6wssirt73KvaO6PC9zdHJvbmc+1NogQ29tcG9zaXRlIMn5w/fL+dPQt723qKOs0vK0y8jnufvU2rHg0uvG2rbU09rSttfTvdq148q508PV4tCpt723qKOsseDS677Nu+GxqLTto6yxyL3PsLLIq6OsyLG148rHsru5u824w/ejrNLyzqrSttfTvdq147rNyvfWpr3ateO9q77f09Cyu82stcS907/aoaM8L3A+CjxwPjxicj4KPC9wPgo8aDE+sLLIq8q9tcS6z7PJxKPKvTwvaDE+CjxwPjxicj4KPC9wPgo8aDI+PHN0cm9uZz694bm5zbw8L3N0cm9uZz48L2gyPgo8cD48aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/76/1_h43ae__.png" alt="\">

所涉及的角色

(1)抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。合成对象通常把它所包含的子对象当做类型为 Component 的对象。在安全式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。

(2)树叶构件(Leaf)角色:树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

(3)树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如add()、remove()以及components()的声明。

代码实现

import java.util.*;
interface Component
{
	//返还自己的实例
	Composite getComposite();
	//某个商业方法
	void sampleOp();
}
class Composite implements Component
{
	private List
  
    componentList = new ArrayList
   
    (); //返还自己的实例 public Composite getComposite() { return this; } //某个商业方法 public void sampleOp() { Iterator it = componentList.iterator(); while(it.hasNext()) { ((Component)it.next()).sampleOp(); } } //容器管理,增加子构件对象 public void add(Component c) { componentList.add(c); } //容器管理,删除子构件对象 public void remove(Component c) { componentList.remove(c); } } class Leaf implements Component { //返还自己的实例 public Composite getComposite() { //Write you code here return null; } //某个商业方法 public void sampleOp() { //Write your code here } }
   
  

透明式的合成模式


结构图

\

所涉及的角色

(1)抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象规定一个接口,规范共有的接口及默认行为。这个接口可以用来管理所有的子对象,要提供一个接口以规范取得和管理下层组件的接口,包括add()、remove()以及getChild()之类的方法。

(2)树叶构件(Leaf)角色:代表参加组合的树叶对象,定义出参加组合的原始对象的行为。树叶类会给出add()、remove()以及getChild()之类的用来管理子类对象的方法的平庸实现。

(3)树枝构件(Composite)角色:代表参加组合的有子对象的对象,定义出这样的行为。

代码实现

import java.util.*;
interface Component
{
	//返还自己的实例
	Composite getComposite();
	//某个商业方法
	void sampleOp();
	//容器管理,增加子构件对象
	void add(Component c);
	//容器管理,删除子构件对象
	void remove(Component c);
}
class Composite implements Component
{
	private List
  
    componentList = new ArrayList
   
    (); //返还自己的实例 public Composite getComposite() { return this; } //某个商业方法 public void sampleOp() { Iterator it = componentList.iterator(); while(it.hasNext()) {