现在的位置: 首页 > 综合 > 正文

设计模式之策略模式-孙悟空是如何炼成的(3)

2017年12月15日 ⁄ 综合 ⁄ 共 1691字 ⁄ 字号 评论关闭

Design pattern Strategy

目录

1 一句话

2 孙悟空是如何炼成的

3 策略模式

3.1 场景
3.2 设计方案
3.3 策略模式
3.4 何时使用策略模式
3.5 代码实现

1 一句话

策略模式将算法使用者和算法分割开,达到了在运行期间,可以自由切换算法的目的。
导演可以选用不同的演员去演孙悟空。(具体演孙悟空的演员是算法实现,导演是算法使用者)

2 孙悟空是如何炼成的

      玉皇大帝最近喜欢看孙悟空的电影/电视剧,太白金星、观音菩萨、如来佛祖三位导演为了讨好玉皇大帝决定拍有关孙悟空的电影。三位导演拿到资金以后就开始想孙悟空用谁来演,都想到了六小龄童和周星驰这两位演员不错,而且都想到了孙悟空有72搬变化。

      太白金星道行比较浅,而且年纪大了,容易糊涂,而且比较懒,就直接找来六小龄童和周星驰,和这2为演员都签约,让每位演员拍一遍电影,最后拍出了《西游记》和《大话西游》2部电影,让玉皇大帝选择自己喜欢的演员看其中的一部电影。下图是太白金星设计的UML图。

      玉皇大帝对太白金星不满意了,演员和剧情都定死了,如果我想让周星驰演《西游记》怎么办?

      观音菩萨比太白金星道行深些,打听到玉皇大帝喜欢周星驰这个演员,决定让周星驰演孙悟空,于是和周星驰说你先学下猴子的72变化表演吧,周同学很努力,很快就学会了72变化表演,最好观音菩萨和周星驰签约了,最后拍好了《大话西游》。观音菩萨设计的UML图如下:

       当观音菩萨拿给玉皇大帝看时,前几天玉皇大帝很喜欢,可是过了段时间,玉皇大帝看腻了,想看六小龄童演的孙悟空。这下观音菩萨只的重头找六小龄童再向请周星驰演一样拍《西游记》。

      如来佛祖是3个导演中道行最深的,他不急于拍,他了解到玉皇大帝的口味有多种,有时候想看周星驰演的孙悟空,有时候想看六小龄童扮的孙悟空。他首先找来2为演员和他们说,回去先学猴子的72变化表演吧,可能会让你们演孙悟空。2为演员很高兴回去了。同时,他约好玉皇大帝,和玉皇大帝说,电影剧情根据您的选择来定。玉皇大帝很高兴,因为如来佛祖考虑到了自己的喜好,而且还让自己参与剧情设计。玉皇大帝说《西游记》别让六小龄童演了,让周星驰演吧。如来佛祖怕玉皇大帝哪天又改变主意就设计了下面的UML类图

 

 

3 策略模式

 3.1 场景

算法使用者可能使用多种算法实现相同的功能。

如算法使用者可能使用冒泡排序算法、选择排序、插入排等实现排序功能。

3.2 设计方案

以下是3中设计方案

(1)所有的算法方案都放在算法使用者里面。算法使用者利用条件选择语句决定使用哪一个算法。这样一来,算法使用者代码会变得复杂和难以维护。例如一开始设计的算法有冒泡排序、选择排序、插入排序算法,那么算法使用者后期想用快速排序怎么办?这种方案类似于上述的太白金星拍电影方式。

(2)算法使用者可以利于实现接口的方式或继承的办法在子类里面实现不同的行为,但是这样算法使用者还是和具体的算法绑定在一起,这种强耦合会使两者不能单独演化,不够灵活。如上述观音菩萨拍电影方式。如java中的Comparable接口

(3)使用策略模式。策略模式把算法使用者和算法分割开。算法使用者负责调用具体的算法,算法则提供给客户端具体去实现,例如客户端想使用快速排序算法,则自己提供快速排序算法,然后向算法使用者传入快速排序的算法。由于算法实现和算法使用者分开,算法的修改和增加都不会影像都算法使用者。如上述如来佛祖拍电影方式。如java中的Comparator接口

3.3  策略模式Strategy

策略模式是把算法使用者和算法分割开的设计模式,达到了在运行期间,可以自由切换算法的目的。

策略模式有3个角色:

算法使用者:负责调用具体的算法;

算法:各种具体算法的接口或抽象类;

具体算法:包装了相关的算法和行为。

3.4 何时使用策略模式

在下面的情况下应当考虑使用策略模式

(1)以不同的格式保存文件;
(2)以不同的算法压缩文件;
(3)以不同的算法截获图象;
(4)以不同的格式输出同样数据的图形,比如曲线 或框图bar等

3.5 代码实现

下面代码是实现如来佛祖拍电影的java代码(代后续完成)

抱歉!评论已关闭.