Chain of Responsibility, Command and Iterator, Mediator, Memento

Sun, Apr 10, 2022 One-minute read

1. Chain of Responsibility

当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时, 可以使用责任链模式。当必须按顺序执行多个处理者时, 可以使用该模式。如果所需处理者及其顺序必须在运行时进行改变, 可以使用责任链模式。

  • AuthService
  • AuthController

重写后

  • imp
    • Level1AuthLink.jav
    • Level2AuthLink.jav
    • Level3AuthLink.java
  • AuthInfo.java
  • AuthLink.java

⼀般在使⽤责任链时候如果是场景⽐较固定,可以通过写死到代码中进⾏初始化。但如果业务场景 经常变化可以做成xml配置的⽅式进⾏处理,也可以落到库⾥进⾏初始化操作

测试类

AuthLink new 一个新类,里面包含了三级人员信息

AuthService.auth模拟审批

2. Command

通过操作来参数化对象,将操作放入队列中、 操作的执行或者远程执行操作, 可使用命令模式,实现操作回滚功

比如点菜,根据客户不同需求服务员传递给厨师。

避免一堆的if else

  • result
    • impl
      • A
      • B
      • C
    • IRes
  • require
    • impl
      • AReq
      • BReq
      • CReq
    • IRequire
  • Commander

3. Iterator

当集合背后为复杂的数据结构, 且你希望对客户端隐藏其复杂性时 (出于使用便利性或安全性的考虑), 可以使用迭代器模式,

  • group
    • Employee.java
    • GroupStructure.java
    • Link.java
  • lang
    • Collection.java
    • Iterable.java
    • Iterator.java

4. Mediator

当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式, 当组件因过于依赖其他组件而无法在不同应用中复用时,如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

Mysql和Oracle都是数据库层, ORM框架就是中介,再到不同的应用

比如只用了一个JDBCUtil时候,直接操作数据库,用中介模式开发ORM

  • dao

    • ISchool.java
    • IUserDao.java
  • mediator

    • Configuration.java

    • SqlSession.java

    • DefaultSqlSession.java
    • SqlSessionFactory.java
    • DefaultSqlSessionFactory.java
    • SqlSessionFactoryBuilder.java
- Resources.java

通过中介者模式的设计思想⼿写⼀个ORM框架,隐去了对数据库操作的复杂度,让外 部的调⽤⽅可以⾮常简单的进⾏操作数据库。这也是平常使⽤的 Mybatis 的原型,在⽇ 常的开发使⽤中,只需要按照配置即可⾮常简单的操作数据库。

还有服务接⼝的包装也可以使⽤中介者模式来实现。可以把这些奖品接⼝统⼀收到中台开发⼀个奖品 中⼼,对外提供服务。

  • po
    • School.java
    • User.java

中介者模式模型结构 以上是对ORM框架实现的核⼼类,包括了;加载配置⽂件、对xml解析、获取数据库session、操 作数据库以及结果返回。 左上是对数据库的定义和处理,基本包括我们常⽤的⽅法; T selectOne 、 List selectList 等。 右侧蓝⾊部分是对数据库配置的开启session的⼯⼚处理类,这⾥的⼯⼚会操 作 DefaultSqlSession 之后是红⾊地⽅的 SqlSessionFactoryBuilder ,这个类是对数据库操作的核⼼类;处理⼯⼚、 解析⽂件、拿到session等。 接下来我们就分别介绍各个类的功能实现过程。 2. 代码实现 2.1 定义SqlSession接⼝ $ !"" resources $ #"" mapper $ $ #"" School_Mapper.xml $ $ !"" User_Mapper.xml $ !"" mybatis-config-datasource.xml

5. Memento

对象快照,数据安全性

old:

  • Admin
  • ConfigFile
  • ConfigMemento : 备忘录类,相当于是对原有配置类的扩展
  • ConfigOriginator :记录者类,获取和返回备忘录类对象信息

admin逻辑: new一个admin,ConfigOriginator记录着

configOriginator.setConfigFile,记录一个版本号 admin.append(ConfigOriginator.saveMemento())

回滚 configOriginator.getMemento(admin.undo())