GoF著作中未提到的设计模式2: Archetype(转载)
原文链接:http://www.cnblogs.com/west-link/archive/2011/06/16/2082422.html ?半天也没能给这个设计模式想出一个中文名称,算了,有时候还是原版的更容易理解。
? 简单地说,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); } }?
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); } }?
特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!