首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

GoF著述中未提到的设计模式2: Archetype(转载)

2012-07-01 
GoF著作中未提到的设计模式2: Archetype(转载)原文链接:http://www.cnblogs.com/west-link/archive/2011/0

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);        }  }
?
? 可以看到,最后一步都交给了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著述中未提到的设计模式2: Archetype(转载)

特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!

热点排行