随笔 - 25  文章 - 0 评论 - 163 阅读 - 16万
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

GoF著作中未提到的设计模式(1):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种事件记录方式。
 
 
posted on   West_Link  阅读(2977)  评论(10编辑  收藏  举报
编辑推荐:
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
阅读排行:
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡
点击右上角即可分享
微信分享提示