GoF著作中未提到的设计模式之一: Archetype

半天也没能给这个设计模式想出一个中文名称,算了,有时候还是原版的更容易理解。

简单地说,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种事件记录方式。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值