您的位置:首页 > 其它

.NET设计模式(11):组合模式(Composite Pattern)

2009-02-05 12:01 417 查看

.NET设计模式(11):组合模式(Composite Pattern)

组合模式(Composite Pattern)

——.NET设计模式系列之十一

Terrylee,2006年3月

概述

组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

意图

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。[GOF 《设计模式》]

结构图

public abstract class Graphics

public class Picture : Graphics

public class Line:Graphics

public class Circle : Graphics

public class Rectangle : Graphics

public abstract class Graphics

public class Picture : Graphics

public class Line : Graphics

public class Circle : Graphics

public class Rectangle : Graphics

public class Line : Graphics

public abstract class Graphics

public class Picture : Graphics

public class Line : Graphics

public class Circle : Graphics

public class Rectangle : Graphics

public class App

public interface IReadableLocator : IEnumerable<KeyValuePair<object, object>>

public abstract class ReadableLocator : IReadableLocator

public interface IReadWriteLocator : IReadableLocator

{

//保存对象到定位器

void Add(object key, object value);

//从定位器中删除一个对象,如果成功返回真,否则返回假

bool Remove(object key);

}
从ReadWirteLocator派生的具体类是Locator类,Locator类必须实现一个定位器的全部功能,现在我们所看到的Locator它已经具有了管理定位器的功能,同时他还应该具有存储的结构,这个结构是通过一个WeakRefDictionary类来实现的,这里就不介绍了。[关于定位器的介绍参考了niwalker的Blog]

效果及实现要点

1.Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。

2.将“客户代码与复杂的对象容器结构”解耦是Composite模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。

3.Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。

4.Composite模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。

适用性

以下情况下适用Composite模式:

1.你想表示对象的部分-整体层次结构

2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

总结

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。

参考资料

阎宏,《Java与模式》,电子工业出版社

James W. Cooper,《C#设计模式》,电子工业出版社

Alan Shalloway James R. Trott,《Design Patterns Explained》,中国电力出版社

MSDN WebCast 《C#面向对象设计模式纵横谈(9):Composite组合模式(结构型模式)》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: