| 行为类模式大PK |
- 行为类模式包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。该组设计模式众多,如下我们着重介绍一下命令模式VS策略模式、状态模式VS策略模式、观察者模式VS责任链模式。
| 命令模式VS策略模式 |
命令模式和策略模式类图很相似,只是命令模式多了一个接收者(Receiver)角色,通过确切的Command类调用Receiver类,实现了调用者和具体的接收者的解耦。策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务,通过对算法的封装实现算法的独立,并且可以相互转换,让行为的变化独立于拥有行为的客户,如我们在策略模式中的例子:诸葛亮给赵云的锦囊妙计,其中每个计策就是一个算法,对妙计进行封装,在不同的时间调用执行不同的计策;而命令模式是对动作解耦,把一个动作的执行分为执行对象(Receiver)和执行行为(Command),让两者相互独立而不相互影响,我们在命令模式中举出了软件开发的例子,软件开发中包括美工组、界面组、编码组,这就是各个执行对象,还包括一个产品经理,就是那个执行行为,客户通过只跟Command打交道实现各个执行对象的行为。
接下来我们从对文件压缩的业务需求出发,分别按照命令模式和策略模式设计出一套实现,来看看他们侧重点的不同。文件的压缩其中有两种格式zip和gzip,他们是两种不同的压缩格式,我们将分别实现不同格式的压缩和解压缩功能。
- 命令模式实现对文件的压缩和解压缩
命令模式的主旨是封装命令,使请求者和实现者解耦。我们先看看命令模式实现文件压缩和解压缩的类图:
首先介绍一下命令的抽象执行类(IReceiver),该类包括两个方法,对文件的压缩方法和解压缩方法。本类图中是按照压缩格式来设计接口,还可以依照职责设计接口,那么有两个类(CompressReceiver和UncompressReceiver)实现该接口,接口中有两个方法(zipExecute和gZipExecute方法),该类图请读者自己思考,在此没有给出相关设计。如上类图中IReceiver的源码如下:
public interface IReceiver { //包含两个方法,压缩和解压缩 public boolean compress(String source, String to); public boolean uncompress(String source, String to); }