5-2 面向可维护性的设计模式

一、创造型的模式

1、工厂方法模式

  定义一个用于创建对象的工厂接口,其子类型来决定创建对象时实例化哪一个类。模式如下,Product是一个对象,其有子类ProductOne、ProductTwo等,定义一个工厂接口Creator,其有工厂方法factoryMethod,这样就可以利用工厂方法去创建对象。不同的工厂方法实例化接口Product不同的子类,但返回的都是接口类型,即Product:
在这里插入图片描述
  一个例子:
在这里插入图片描述
  静态工厂就不用new了:
在这里插入图片描述在这里插入图片描述

2、抽象工厂模式

  提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体实现类。
  具体形式如下,有多个产品类(下图的AbstractProductA、B等),其子类有固定的组合(例如ProductA1和ProductB1是固定组合),然后每一个抽象工厂类封装相应的一些产品子类在一起(例如ConcreteFactory1封装了ProductA1和ProductB1的组合)。当客户端需要使用一套产品时,可以通过相应的抽象工厂类去创建:
在这里插入图片描述
  举个例子,下图是factory代码,其中AbstractWidgetFactory是抽象工厂接口,WidgetFactory1、2是抽象工厂子类,每个类中有不同产品的各自的工厂方法:
在这里插入图片描述
  客户端代码如下,builder是一个辅助类,可以向他传入抽象工厂来构造一组对象:
在这里插入图片描述
二、结构模式

代理模式:

  某个类不方便被client直接访问,故client通过一个proxy去访问这个类。有三种情况:远程代理(cache)、虚代理(延迟创建对象)、保护代理。

  总体形式如下,由于访问RealSubject代价太高等原因,创建一个代理Proxy,通过委托机制去访问它:
在这里插入图片描述

  举个例子,对于一个图片对象来说,每次创建一个对象都需要从磁盘读取,代价高昂,并且读取了不一定会使用:
在这里插入图片描述

  使用一个proxy类,当需要使用的时候,才从磁盘读取:在这里插入图片描述

三、行为模式

1、观察者模式

  一种类似于“偶像-粉丝”的框架,可以维护一对多的关系。粉丝可以到偶像那注册,偶像维护一个粉丝的列表,偶像状态发生了变化(有动态)会通知所有粉丝。

  形式如下图所示,一个Subject接口(抽象类),他维护他的观察者的列表,并且可以改变状态(setstate)、通知观察者(notify),一个Observer接口,它可以设置自己观察的对象、更新状态(由观察的对象notify的时候回调):
在这里插入图片描述

  举个例子,下图是一个Subject,维护列表、通知观察者、设置状态等功能如下图:
在这里插入图片描述

  下图是一个观察者子类,可以设置Subject、更新状态(由Subject回调):
在这里插入图片描述

2、访问者模式

  将一个ADT与对ADT的操作(visit)分离开来,这样可以自由更改对ADT的各种操作而不用影响ADT。

  形式如下图,有一个Visitor接口,含有针对某ADT的所有子类的visit操作,其可以有多种子类代表对ADT的不同操作;ADT中有accept方法,用来接受别人对自己的操作,也可以通过accept选取不同种类的操作:
在这里插入图片描述
  举个例子,下图是visitor相关类/接口,每个类中有分别对某一ADT的子类Book、Fruit的操作:
在这里插入图片描述

  ADT如下,每个子类有accept方法,用来接受外部对自己的操作:
在这里插入图片描述

  客户端如下,这样就可以实现对一系列不同类物品的遍历和操作:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值