设计模式之美:Extension Object(扩展对象)
索引
意图
预期对象的接口将在未来被扩展。通过额外的接口来定义扩展对象。
Anticipate that an object’s interface needs to be extended in the future.
Additional interfaces are defined by extension objects..
结构

参与者
Subject
- 定义抽象主体对象。其定义用于查询是否包含特定扩展的接口。
Extension
- 所有扩展类的抽象基类。可以定义负责管理扩展自身的操作。
- Extension 知道其是谁的扩展。
ConcreteSubject
- 具体的主体类。实现基类定义的 GetExtension 方法并返回相应的扩展对象。
AbstractExtension
- 特定种类的扩展类的抽象基类。
ConcreteExtension
- 继承并实现 AbstractionExtension 类。实现特定的扩展功能。
适用性
当以下情况成立时可以使用 Extension Object 模式:
- 当需要为已有对象额外添加全新的或无法预见的接口时。
- 抽象的主要接口在不同的客户类中拥有不同的角色时。
- 无法通过子类型化来扩展接口行为时。
效果
- 扩展对象促进了增加新扩展功能。
- 类的主要抽象接口不会过于膨胀。
- 接口的主要抽象在不同的子系统中可实现不同的角色。
- 客户类变得更加复杂。
- 需要控制对扩展对象的滥用。
相关模式
- Visitor模式可以为层级的类结构增加新的行为。Visitor 模式与 Extension Object 模式拥有类似的益处。相比 Visitor 模式,Extension Object 模式不需要一个稳固的类层级结构,并且也不引入循环依赖。
- Decorator模式是另一个可以扩展类的行为的模式。客户类在使用 Decorator 对象时的透明性比使用 Extension Object 更好。在使用窄接口或需要增强已知接口时更适合使用 Decorator 模式。
- Adapter模式支持适配一个已知接口。Extension Object 模式支持附加的接口。当对象需要对扩展接口进行适配时可以同时使用 Extension Object 模式和 Adapter 模式。
实现
实现方式(一):使用示例结构实现 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 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Extension Object(扩展对象)的更多相关文章
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- 设计模式之美:Role Object(角色对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现. 意图 通过明确地附加角色对象到目标对象中,以使对象可以适配不同的客户需求.每个角色对象都代 ...
- 设计模式之美:Null Object(空对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...
- 设计模式之美:Type Object(类型对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...
- Extension Objects(扩展对象)
设计模式之美:Extension Objects(扩展对象) 索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Objects. 实现方 ...
- 设计模式之美:Dynamic Property(动态属性)
索引 别名 意图 结构 参与者 适用性 效果 实现 实现方式(一):Dynamic Property 的示例实现. 别名 Property Properties Property List 意图 使对 ...
- 设计模式之美:Command(命令)
索引 别名 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):直接注入 Receiver 对象,Command 决定调用哪个方法. 实现方式(二):注入 Receiver 的指定方法, ...
- 设计模式之美:Singleton(单件)
索引 意图 结构 参与者 适用性 缺点 效果 相关模式 实现 实现方式(一):使用 Static 变量初始化 Singleton. 实现方式(二):使用 Lazy Initialization 来实现 ...
- 设计模式之美:Abstract Factory(抽象工厂)
索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...
随机推荐
- 在linux中添加ftp用户,并设置相应的权限
在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...
- [OSI]网络7层模型的理解
应用层:HTTP 应用层 表现层:编码 表现层 会话层:端口 会话层 传输层:TCP/UDP 协议 传输层 网络层:IP 标记 +-- 网络层 --+ 网络层 数据链路层:计算机Mac地址标记 | ...
- AC算法 及python实现
零 导言 软件安全课上,老师讲了AC算法,写个博客,记一下吧. 那么AC算法是干啥的呢? ——是为了解决多模式匹配问题.换句话说,就是在大字符串S中,看看小字符串s1, s2,...有没有出现. AC ...
- [11]APUE:(文件)记录锁
[a] 概念 建议锁:在遵循相同记录锁规则的进程间生效,通常用于保证某个程序自身多个进程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后建立同名副本 ...
- A multi-faceted language for the Java platform
最近在研究关于groovy 相关的技术 希望有研究交到研究这方面的朋友 Groovy 最新的地址 http://www.groovy-lang.org/
- 禁止VMware虚拟机与Host的时间同步
禁止VMware虚拟机与Host的时间同步 1. 查看虚拟机是否安装了 VMware Tools, 如果有安装,则将 VMware Tools 属性窗口的“选项”-->“其他选项”中“虚拟机与宿 ...
- 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- Linux Oracle删除归档日志
今天遇到Oracle报这样的错:ORA-00257 查看了下,原来是Oracle的归档日志满了,解决方案两个 一:增加归档日志大小 二:删除无用的归档日志(我们选择这个方案) 什么也不说了Linux下 ...
- HTML 学习记录
<h1>This is a heading </h1> 标题 h后面的数字是字体大小 <p>This is a paragraph.</p>段落 < ...
- 图片预加载和AJAX的图片预加载
利用js实现图片预加载,加载所需要图片的路径与名称即可,很容易实现,该方法尤其适用预加载大量的图片: <div class="hidden"> <script t ...