3种设计模式知识要点"> 3种设计模式知识要点">
← 返回目录

第 6 卷

第 6 / 9 卷作者:000日期:

} }

使用场景:

  • 关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”关系。
  • 事件多级触发场景。
  • 跨系统的消息交换场景,如消息队列的处理机制。

注意:

  • 广播链的问题

在一个观察者模式中最多出现一个对象既是观察者也是被观察者,也就是说消息最多转发一次(传递两次)。

  • 异步处理问题

观察者比较多,而且处理时间比较长,采用异步处理来考虑线程安全和队列的问题。

17.门面模式(Facade Pattern)

定义:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.(要求一

个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。)

  • Facade 门面角色

客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就说该角色没

有实际的业务逻辑,只是一个委托类。

  • subsystem 子系统角色

可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户

端而已。

使用场景:

  • 为一个复杂的模块或子系统提供一个供外界访问的接口
  • 子系统相对独立——外界对子系统的访问只要黑箱操作即可
  • 预防低水平人员带来的风险扩散

注意:

●一个子系统可以有多个门面 ●门面不参与子系统内的业务逻辑

18.备忘录模式(Memento Pattern)

state so that the object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该

对象恢复到原先保存的状态。)

  • Originator 发起人角色

记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。

  • Memento 备忘录角色(简单的 javabean)

负责存储 Originator 发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。

  • Caretaker 备忘录管理员角色(简单的 javabean)

对备忘录进行管理、保存和提供备忘录。

使用场景:

  • 需要保存和恢复数据的相关状态场景。
  • 提供一个可回滚(rollback)的操作。
  • 需要监控的副本场景中。
  • 数据库连接的事务管理就是用的备忘录模式。

注意:

●备忘录的生命期 ●备忘录的性能

不要在频繁建立备份的场景中使用备忘录模式(比如一个 for 循环中)。

clone 方式备忘录:

  • 发起人角色融合了发起人角色和备忘录角色,具有双重功效

多状态的备忘录模式

  • 增加了一个 BeanUtils 类,其中 backupProp 是把发起人的所有属性值转换到

HashMap 中,方便备忘录角色存储。restoreProp 方法则是把 HashMap 中的值返回到发起人角色中。

BeanUtil 工具类代码:

public class BeanUtils { //把 bean 的所有属性及数值放入到 Hashmap 中

public static HashMap<String,Object> backupProp(Object bean){ HashMap<String,Object> result = new

HashMap<String,Object>();

try {

//获得 Bean 描述 BeanInfo

beanInfo=Introspector.getBeanInfo(bean.getClass());

//获得属性描述 PropertyDescriptor[]

descriptors=beanInfo.getPropertyDescriptors();

//遍历所有属性 for(PropertyDescriptor des:descriptors){

//属性名称 String fieldName = des.getName();

//读取属性的方法 Method getter = des.getReadMethod();

//读取属性值 Object fieldValue=getter.invoke(bean,new

Object[]{});

if(!fieldName.equalsIgnoreCase("class")){ result.put(fieldName, fieldValue);

} }

} catch (Exception e) { //异常处理

} return result;

} //把 HashMap 的值返回到 bean 中

public static void restoreProp(Object bean,HashMap<String,Object> propMap){

try { //获得 Bean 描述

BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());

//获得属性描述 PropertyDescriptor[] descriptors =

beanInfo.getPropertyDescriptors();

//遍历所有属性 for(PropertyDescriptor des:descriptors){

//属性名称 String fieldName = des.getName();

//如果有这个属性 if(propMap.containsKey(fieldName)){

//写属性的方法 Method setter = des.getWriteMethod();

setter.invoke(bean, new Object[]{propMap.get(fieldName)});

全站分卷索引 · 9 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷