1700477909
1700477910
运行结果如下所示:
1700477911
1700477912
========执行算法========
1700477913
1700477914
c:\windows—>d:\windows.zip ZIP压缩成功!
1700477915
1700477916
c:\windows.zip—>d:\windows ZIP解压缩成功!
1700477917
1700477918
要使用gzip算法吗?在客户端(Client)上把注释删掉就可以了,其他的模块根本不受任何影响,策略模式关心的是算法是否可以相互替换。策略模式虽然简单,但是在项目组使用得非常多,可以说随手拈来就是一个策略模式。
1700477919
1700477920
1700477921
1700477922
1700477923
设计模式之禅 32.1.2 命令模式实现压缩算法
1700477924
1700477925
命令模式的主旨是封装命令,使请求者与实现者解耦。例如,到饭店点菜,客人(请求者)通过服务员(调用者)向厨师(接收者)发送了订单(行为的请求),该例子就是通过封装命令来使请求者和接收者解耦。我们继续来看压缩和解压缩的例子,怎么使用命令模式来完成该需求呢?我们先画出类图,如图32-2所示。
1700477926
1700477927
1700477928
1700477929
1700477930
图32-2 命令模式实现压缩算法的类图
1700477931
1700477932
类图看着复杂,但是还是一个典型的命令模式,通过定义具体命令完成文件的压缩、解压缩任务,注意我们这里对文件的每一个操作都是封装好的命令,对于给定的请求,命令不同,处理的结果当然也不同,这就是命令模式要强调的。我们先来看抽象命令,如代码清单32-6所示。
1700477933
1700477934
代码清单32-6 抽象压缩命令
1700477935
1700477936
public abstract class AbstractCmd{
1700477937
1700477938
//对接收者的引用
1700477939
1700477940
protected IReceiver zip=new ZipReceiver();
1700477941
1700477942
protected IReceiver gzip=new GzipReceiver();
1700477943
1700477944
//抽象方法,命令的具体单元
1700477945
1700477946
public abstract boolean execute(String source,String to);
1700477947
1700477948
}
1700477949
1700477950
抽象命令定义了两个接收者的引用:zip接收者和gzip接收者,大家可以想象一下这两个“受气包”,它们完全是受众,人家让它干啥它就干啥,具体使用哪个接收者是命令决定的。具体命令有4个:zip压缩、zip解压缩、gzip压缩、gzip解压缩,分别如代码清单32-7、32-8、32-9、32-10所示。
1700477951
1700477952
代码清单32-7 zip压缩命令
1700477953
1700477954
public class ZipCompressCmd extends AbstractCmd{
1700477955
1700477956
public boolean execute(String source,String to){
1700477957
1700477958
return super.zip.compress(source,to);
[
上一页 ]
[ :1.700477909e+09 ]
[
下一页 ]