设计模式之策略模式

来源:互联网 发布:windows 相对路径 编辑:程序博客网 时间:2024/04/29 08:08

假如给我们两个数,要求实现对这两个数的基本加减乘除法,你会怎么去实现?

这样看似简单的问题,我们可以使用两个方法(一个加的方法,一个减的方法),然后在主函数if判断,调用一下就行了。

这么的方案显然是可行的,但是在实际的项目中,加入需求更改,需要加入取模,乘方计算呢?

然后我们根据上面的代码,再加上if,else判断就好了。

现在需求再次更改,可能针对两个数的运算有几十种,那么我们继续加if else判断!!!
到此时,除了你的几十个if、else判断比较丑之外,需求是OK的,代码量大了一点,不过加加班还是OK的。

加完班第二天回来,需求又改了,这次,客户可能对这两个数有自己的操作,比如某个客户输入两个数A,B,希望得到他自己定义的A的B进制数。还比如有一个客户希望……

这还玩蛇?我都不知道会有什么运算,这我TM怎么if、else???
完了,完了!!

然后策略模式就来了。
不用策略模式还不好解决呢。

我们只要执行如下操作,即可实现需求:
1、定义一个接口,接口内有一个方法,表示用户进行的操作(抽象策略类)

public interface StrategyDesign {    int calculate(int l,int r);}

2、定义一个环境类

public class Environment implements StrategyDesign{    private StrategyDesign environment;    public StrategyDesign getStrategyDesign() {        return environment;    }    public void setStrategyDesign(StrategyDesign environment) {        this.environment =  environment;    }    @Override    public int calculate(int l, int r) {        return environment.calculate(l,r);    }}

3、定义一个客户端类,供客户使用

public class Client {    public static void main(String[] args) {        Environment environment=new Environment();        environment.setStrategyDesign(客户自定义操作的对象);        System.out.println(environment.calculate(用户需要计算的操作数,用户需要计算的操作数));    }}

这样,我们就实现了我们的策略模式,完成了客户的需求。
比如客户需要一个加法操作,那么客户自己实现自己的加法操作。

public class AddStrategy implements StrategyDesign {    @Override    public int calculate(int l, int r) {        return l+r;    }}

然后在environment中调用即可。

然后客户又需要使用减法,那么只需要set就好了而不用重新去new一个对象。

public class Client {    public static void main(String[] args) {        Environment environment=new Environment();        environment.setStrategyDesign(new AddStrategy());        System.out.println(environment.calculate(3,5));        RemoveStrategy remove=new RemoveStrategy();        environment.setStrategyDesign(remove);        System.out.println(environment.calculate(5,8));    }}

通过这个例子,相信大家能很好的理解策略模式。
那么,现在我们一起来讨论一下,策略模式到底有什么奇妙的地方。

我说的没用,我是个小白,我们看官方说的:

The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.(策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。)

策略模式的三部分:

1、抽象策略角色: 策略类,通常由一个接口或者抽象类实现。2、具体策略角色:包装了相关的算法和行为。3、环境角色:持有一个策略类的引用,最终给客户端调用

这和我上面实现的是一样的,都是包含三个部分。

策略模式的优缺点:

优点:1、 策略模式提供了管理相关的算法族的办法。   策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。2、 策略模式提供了可以替换继承关系的办法。   继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。3、 使用策略模式可以避免使用多重条件转移语句。   多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。缺点:1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。   这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。   有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

策略模式在我们的编程中很常见,比如我们使用Arrays的sort,我们传入进去的比较规则,就是用到了策略模式,观察源码即可发现,其实sort内部的排序规则就是调用了我们自定义的比较规则。是一个非常典型的策略模式。

1 0
原创粉丝点击