设计模式之美:Extension Object(扩展对象)
2014-04-23 22:39
274 查看
索引
意图
结构
参与者
适用性
效果
相关模式
实现
实现方式(一):使用示例结构实现 Extension Object。
实现方式(二):使用泛型实现 IExtensibleObject<T> 接口。
[b]意图[/b]
预期对象的接口将在未来被扩展。通过额外的接口来定义扩展对象。
Anticipate that an object’s interface needs to be extended in the future.
Additional interfaces are defined by extension objects..
[b]结构[/b]
![](http://images.cnitblog.com/i/175043/201404/232115388104198.png)
[b]参与者[/b]
Subject
定义抽象主体对象。其定义用于查询是否包含特定扩展的接口。
Extension
所有扩展类的抽象基类。可以定义负责管理扩展自身的操作。
Extension 知道其是谁的扩展。
ConcreteSubject
具体的主体类。实现基类定义的 GetExtension 方法并返回相应的扩展对象。
AbstractExtension
特定种类的扩展类的抽象基类。
ConcreteExtension
继承并实现 AbstractionExtension 类。实现特定的扩展功能。
[b]适用性[/b]
当以下情况成立时可以使用 Extension Object 模式:
当需要为已有对象额外添加全新的或无法预见的接口时。
抽象的主要接口在不同的客户类中拥有不同的角色时。
无法通过子类型化来扩展接口行为时。
[b]效果[/b]
扩展对象促进了增加新扩展功能。
类的主要抽象接口不会过于膨胀。
接口的主要抽象在不同的子系统中可实现不同的角色。
客户类变得更加复杂。
需要控制对扩展对象的滥用。
[b]相关模式[/b]
Visitor 模式可以为层级的类结构增加新的行为。Visitor 模式与 Extension Object 模式拥有类似的益处。相比 Visitor 模式,Extension Object 模式不需要一个稳固的类层级结构,并且也不引入循环依赖。
Decorator 模式是另一个可以扩展类的行为的模式。客户类在使用 Decorator 对象时的透明性比使用 Extension Object 更好。在使用窄接口或需要增强已知接口时更适合使用 Decorator 模式。
Adapter 模式支持适配一个已知接口。Extension Object 模式支持附加的接口。当对象需要对扩展接口进行适配时可以同时使用 Extension Object 模式和 Adapter 模式。
[b]实现[/b]
实现方式(一):使用示例结构实现 Extension Object。
实现方式(二):使用泛型实现 IExtensibleObject<T> 接口。
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
意图
结构
参与者
适用性
效果
相关模式
实现
实现方式(一):使用示例结构实现 Extension Object。
实现方式(二):使用泛型实现 IExtensibleObject<T> 接口。
[b]意图[/b]
预期对象的接口将在未来被扩展。通过额外的接口来定义扩展对象。
Anticipate that an object’s interface needs to be extended in the future.
Additional interfaces are defined by extension objects..
[b]结构[/b]
![](http://images.cnitblog.com/i/175043/201404/232115388104198.png)
[b]参与者[/b]
Subject
定义抽象主体对象。其定义用于查询是否包含特定扩展的接口。
Extension
所有扩展类的抽象基类。可以定义负责管理扩展自身的操作。
Extension 知道其是谁的扩展。
ConcreteSubject
具体的主体类。实现基类定义的 GetExtension 方法并返回相应的扩展对象。
AbstractExtension
特定种类的扩展类的抽象基类。
ConcreteExtension
继承并实现 AbstractionExtension 类。实现特定的扩展功能。
[b]适用性[/b]
当以下情况成立时可以使用 Extension Object 模式:
当需要为已有对象额外添加全新的或无法预见的接口时。
抽象的主要接口在不同的客户类中拥有不同的角色时。
无法通过子类型化来扩展接口行为时。
[b]效果[/b]
扩展对象促进了增加新扩展功能。
类的主要抽象接口不会过于膨胀。
接口的主要抽象在不同的子系统中可实现不同的角色。
客户类变得更加复杂。
需要控制对扩展对象的滥用。
[b]相关模式[/b]
Visitor 模式可以为层级的类结构增加新的行为。Visitor 模式与 Extension Object 模式拥有类似的益处。相比 Visitor 模式,Extension Object 模式不需要一个稳固的类层级结构,并且也不引入循环依赖。
Decorator 模式是另一个可以扩展类的行为的模式。客户类在使用 Decorator 对象时的透明性比使用 Extension Object 更好。在使用窄接口或需要增强已知接口时更适合使用 Decorator 模式。
Adapter 模式支持适配一个已知接口。Extension Object 模式支持附加的接口。当对象需要对扩展接口进行适配时可以同时使用 Extension Object 模式和 Adapter 模式。
[b]实现[/b]
实现方式(一):使用示例结构实现 Extension Object。
namespace ExtensionObjectPattern.Implementation1 { public abstract class Subject { public abstract void Operation1(); public abstract Extension GetExtension(string extensionType); } public abstract class Extension { protected Subject _owner; public Extension(Subject owner) { _owner = owner; } public abstract void DoSomething(); } public abstract class AbstractExtension : Extension { public AbstractExtension(Subject owner) : base(owner) { } } public class ConcreteExtension : AbstractExtension { public ConcreteExtension(Subject owner) : base(owner) { } public override void DoSomething() { // do something _owner.Operation1(); } } public class ConcreteSubject : Subject { private ConcreteExtension _extension; public ConcreteSubject() { _extension = new ConcreteExtension(this); } public override void Operation1() { // do something } public override Extension GetExtension(string extensionType) { if (extensionType == "some type") { return this._extension; } return null; } } public class Client { public void TestCase1() { Subject subject = new ConcreteSubject(); Extension extension = subject.GetExtension("some type"); extension.DoSomething(); } } }
实现方式(二):使用泛型实现 IExtensibleObject<T> 接口。
namespace ExtensionObjectPattern.Implementation2 { public abstract class Subject : IExtensibleObject<Subject> { public abstract void Operation1(); public abstract IEnumerable<IExtension<Subject>> Extensions { get; } } public interface IExtensibleObject<T> where T : class, IExtensibleObject<T> { IEnumerable<IExtension<T>> Extensions { get; } } public interface IExtension<T> where T : class, IExtensibleObject<T> { void Attach(T owner); void Detach(T owner); } public abstract class Extension : IExtension<Subject> { protected List<Subject> _owners; public void Attach(Subject owner) { _owners.Add(owner); } public void Detach(Subject owner) { _owners.Remove(owner); } public abstract void DoSomething(); } public class ConcreteExtension : Extension { public override void DoSomething() { // do something foreach (var item in _owners) { item.Operation1(); } } } public class ConcreteSubject : Subject { private List<Extension> _extensions = new List<Extension>(); public ConcreteSubject() { Extension extension = new ConcreteExtension(); extension.Attach(this); _extensions.Add(extension); } public override void Operation1() { // do something } public override IEnumerable<IExtension<Subject>> Extensions { get { return _extensions; } } } public class Client { public void TestCase1() { Subject subject = new ConcreteSubject(); foreach (var extension in subject.Extensions) { (extension as Extension).DoSomething(); } } } }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
相关文章推荐
- 来源于WCF的设计模式:可扩展对象模式[上篇]
- 来源于WCF的设计模式:可扩展对象模式[下篇]
- 设计模式学习笔记二:面向对象基础一
- 【出版直播】博客园征途系列,《设计模式——基于C#的工程化实现及扩展》今天上市,共飨博客园圣诞大餐
- Android 设计模式:(三)装饰者模式 —— 装饰对象
- Java基础06:Static;单例设计模式;对象初始化;构造函数;
- [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)
- 杂谈面向对象设计模式
- Java面向对象-单例设计模式
- [笔记]00面向对象设计模式与原则
- 技巧:使用可扩展对象模式扩展HttpApplication
- C#面向对象设计模式:Singleton 单件(创建型模式)
- Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)
- PHP面向对象深入理解之四(设计模式-单例模式)
- 设计模式知识连载(39)---数据访问对象模式---本地存储DAO
- 设计模式学习—传输对象模式(Transfer Object Design Pattern)
- Objective-C设计模式——生成器Builder(对象创建)
- 面向对象设计的几个基本原则和单例模式
- 面向对象设计 从原则到模式
- C#面向对象设计模式纵横谈(6):Prototype 原型(创建型模式)