半天也没能给这个设计模式想出一个中文名称,算了,有时候还是原版的更容易理解。
简单地说,Archetype设计模式的目的是将业务处理逻辑和具体实现分离,所以至少需要两个参与者:Decorator和Delegate,
它们都实现同一个接口,Decorator负责处理业务逻辑,而Delegate负责具体的实现,在Decorator的通用业务逻辑
处理过程中,会把具体实现委派给Delegate。
(注:这里的Decorator并不是指”装饰者“设计模式)
咱们还是用个例子讲吧,假设系统中有一个记录各种事件的接口:
public interface EventRecorder{
// 记录事件的内容
public void record(String event);
}
引入两个抽象类来达到处理逻辑和具体实现分离的目的:
public abstract class EventRecorderDecorator implements EventRecorder{
protected EventRecorderDelegate delegate;
public void setDelegate(EventRecorderDelegate delegate){
this.delegate = delegate;
}
}
public abstract class EventRecorderDelegate implements EventRecorder{
}
下面是两个简单的逻辑处理(Decorator)类:
// 简单的事件记录类
public class SimpleEventRecorder extends EventRecorderDecorator{
public void record(String event){
// 附加当前的日期到事件的内容中
event = getDate() + event;
// 当内容过长时省略显示
event = ellipseText(event);
// 记录事件的内容
delegate.record(event);
}
}
// 复杂的事件记录类
public class ComplicateEventRecorder extends EventRecorderDecorator{
public void record(String event){
// 附加当前的日期到事件的内容中
event = getDate() + event;
// 附加当前异常信息到事件的内容中
event = event+getExceptionText();
// 附加当前的内存、CPU占用率到事件的内容中
event = event+getMachineStatus();
// 当内容过长时省略显示
event = ellipseText(event);
// 记录事件的内容
delegate.record(event);
}
}
可以看到,最后一步都交给了EventRecorderDelegate对象,这一步就是之前所说的“具体实现”,有以下几种记录事件内容的可能性:
1、记录到数据库中
2、记录到本地文件中
3、通过邮件发送
4、发送到远程服务器中
所以我们需要新建四个EventRecorderDelegate的派生类来实现这些记录方式:
public class RecordEventToDatabase extends EventRecorderDelegate{
public void record(String event){
// 将记录写入到数据库中
}
}
public class RecordEventToFile extends EventRecorderDelegate{
public void record(String event){
// 将记录写入到文件中
}
}
public class RecordEventByEmail extends EventRecorderDelegate{
public void record(String event){
// 将记录发送到指定的邮箱
}
}
public class RecordEventToRemoteServer extends EventRecorderDelegate{
public void record(String event){
// 将记录发送到远程服务器上
}
}
下面是一个生成事件记录对象的工厂:
public class EventRecorderFactory{
public static EventRecorder create(int type, int flag){
EventRecorderDelegate delegate = null;
EventRecorderDecorator decorator = null;
if(type == 0)
decorator = new SimpleEventRecorder();
if(type == 1)
decorator = new ComplicateEventRecorder();
if(flag == 0)
delegate = new RecordEventToDatabase();
if(flag == 1)
delegate = new RecordEventToFile();
if(flag == 2)
delegate = new RecordEventByEmail();
if(flag == 3)
delegate = new RecordEventToRemoteServer();
// 设置代理
decorator.setDelegate(delegate);
}
}
从我们举的例子中可以看到,有2种业务处理逻辑,有4个具体实现,它们组成了8种事件记录方式,另外,4个具体实现单独使用的话又有4种记录方式,实际上有12种事件记录方式。
特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!
分享到:
相关推荐
GoF的经典著作设计模式(Design Pattern)
GOF 设计模式 中文 高清 经典书籍 值得拥有 带目录 适合进阶
自己去实现GoF的23中模式时候的知其然不知其所以然,并且有一天在自己设计的系统种由于设计的原因让自己苦不堪言,突然悟到了设计模 第 2 页 共 105 页 k_eckel 设计模式精解-GoF 23 种设计模式解析附 C++实现源码 ...
学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料学习设计模式好的资料
而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想融入到了你的思想中后,...
GOF设计模式中英文+设计模式精解中英文,一共四个文档,高清版
以文本和思维导图的方式简明扼要的介绍了GoF的23个经典设计模式,可当成学习设计模式的一个小手册,偶尔看一下,说不定会对大师的思想精髓有新的领悟。
设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...
设计模式精解-GoF-23种设计模式解析--附C++源代码,帮助理解!
GOF23种经典设计模式中文版 学习设计模式的必备书籍
不多介绍了 GoF+23种设计模式解析附C++实现源码(2nd+Edition).pdf GoF+23种设计模式解析附C++实现源码(2nd+Edition).pdf GoF+23种设计模式解析附C++实现源码(2nd+Edition).pdf
设计模式精解-GoF23种设计模式解析(附C++实现源码)
摘要:电子书籍,C#教程,设计模式 设计模式:基于C#的工程化实现及扩展 pdf全书下载,本书作者以C#重新实现了GOF的模式,同时加入了新近的设计想法,如SOA与Web Services.....等,同时还有相对于其他设计模式而言较新...
GOF的23个设计模式
GOF是设计模式的经典名著Design Patterns: Elements of Reusable Object-Oriented Software(中译本名为《设计模式——可复用面向对象软件的基础》)的四位作者,他们分为是:Elich Gamma、Richard Helm、Ralph ...
23种设计模式UML类图,以及相应的源码,文档,自己找过的,查阅过的网上的资料
设计模式精解-GoF 23种设计模式解析.pdf
Gof-23种设计模式,观察者,适配器,单例,工厂模式
GOF设计模式(中英文双语) GOF设计模式(中英文双语) GOF设计模式(中英文双语)