打字猴:1.700477744e+09
1700477744 设计模式之禅 [:1700454071]
1700477745 32.1 命令模式VS策略模式
1700477746
1700477747 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色。它们虽然同为行为类模式,但是两者的区别还是很明显的。策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务(注意这里是原子业务,而不是原子对象),即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户;而命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色)、执行行为(命令角色),让两者相互独立而不相互影响。
1700477748
1700477749 我们从一个相同的业务需求出发,按照命令模式和策略模式分别设计出一套实现,来看看它们的侧重点有什么不同。zip和gzip文件格式相信大家都很熟悉,它们是两种不同的压缩格式,我们今天就来对一个目录或文件实现两种不同的压缩方式:zip压缩和gzip压缩(这里的压缩指的是压缩和解压缩两种对应的操作行为,下同)。实现这两种压缩格式有什么意义呢?有意义!一是zip格式(.zip后缀)是Windows操作系统常用的压缩格式,gzip格式(.gz后缀)是*nix系统常用的压缩格式;二是JDK提供了对zip和gzip文件的操作包,非常容易实现文件的压缩和解压缩操作。
1700477750
1700477751 下面我们来实现不同格式的压缩和解压缩功能。
1700477752
1700477753 32.1.1 策略模式实现压缩算法
1700477754
1700477755 使用策略模式实现压缩算法非常简单,也是非常标准的,类图如图32-1所示。
1700477756
1700477757
1700477758
1700477759
1700477760 图32-1 策略模式实现压缩算法的类图
1700477761
1700477762 在类图中,我们的侧重点是zip压缩算法和gzip压缩算法可以互相替换,一个文件或者目录可以使用zip压缩,也可以使用gzip压缩,选择哪种压缩算法是由高层模块(实际操作者)决定的。我们来看一下代码实现。先看抽象的压缩算法,如代码清单32-1所示。
1700477763
1700477764 代码清单32-1 抽象压缩算法
1700477765
1700477766 public interface Algorithm{
1700477767
1700477768 //压缩算法
1700477769
1700477770 public boolean compress(String source,String to);
1700477771
1700477772 //解压缩算法
1700477773
1700477774 public boolean uncompress(String source,String to);
1700477775
1700477776 }
1700477777
1700477778 每一个算法要实现两个功能:压缩和解压缩,传递进来一个绝对路径source,compress把它压缩到to目录下,uncompress则进行反向操作——解压缩,这两个方法一定要成对地实现,为什么呢?用gzip解压缩算法能解开zip格式的压缩文件吗?我们分别来看两种不同格式的压缩算法,zip、gzip压缩算法分别如代码清单32-2、32-3所示。
1700477779
1700477780 代码清单32-2 zip压缩算法
1700477781
1700477782 public class Zip implements Algorithm{
1700477783
1700477784 //zip格式的压缩算法
1700477785
1700477786 public boolean compress(String source,String to){
1700477787
1700477788 System.out.println(source+”—>”+to+“ZIP压缩成功!”);
1700477789
1700477790 return true;
1700477791
1700477792 }
1700477793
[ 上一页 ]  [ :1.700477744e+09 ]  [ 下一页 ]