java 23种常用设计模式之策略模式(Strategy)

来源:互联网 发布:贵州省大数据培训 编辑:程序博客网 时间:2024/04/18 10:24

才发现昨天桥接模式上传的代码没通过审核,有点搞不清楚是怎么回事,也懒得问了!代码基本都贴在文章里了,虽然看似有点黑了XX,真的只是个无聊的玩笑而已!

我还是别费脑想故事了,还是规规矩矩的陈述别人的例子吧!虽然没什么人看到这些吐槽式的例子,但是还是为自己的形象着想吧!我不是什么女生,但也不是什么屌丝,我只是喜欢写代码,偶尔吐吐槽而已……没关系的,我写给自己看的而已,大不了代码不传了,反正基本全部都贴出来了!任性!!!

策略模式,定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,目的是让算法独立于使用它的客户而独立变化。

策略模式由三部分组成:

1.抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

2.具体策略角色:包装了相关的算法和行为。

3.环境角色:持有一个策略类的引用,最终给客户端调用。

概念神马的就提这么多吧!上类图:

解释一下:这是简易计算器使用策略模式的一个经典实现,test是客户端,Icalculator作为统一接口,提供算法,是抽象的策略类角色;AbstractCalculator是辅助类,充当具体策略角色,包装了相关算法和行为,提供辅助方法;Plus、Minus和Multiply是Icalculator的三个实现类,充当环境角色,最终给客户端调用。代码:

package com.freedom.strategy;public interface ICalculator {public int calculator(String exp);}package com.freedom.strategy;public class AbstractCalculator {        public int[] split(String exp, String opt) {        String array[] = exp.split(opt);        int arrayInt[] = new int[2];        arrayInt[0] = Integer.parseInt(array[0]);        arrayInt[1] = Integer.parseInt(array[1]);        return arrayInt;    }}package com.freedom.strategy;public class Plus extends AbstractCalculator implements ICalculator {    @Override    public int calculator(String exp) {                int arrayInt[] = split(exp, "\\+");                return arrayInt[0]+arrayInt[1];    }}package com.freedom.strategy;public class Minus extends AbstractCalculator implements ICalculator {    @Override    public int calculator(String exp) {                int arrayInt[] = split(exp, "\\-");                return arrayInt[0]-arrayInt[1];    }}package com.freedom.strategy;public class Multiply extends AbstractCalculator implements ICalculator {    @Override    public int calculator(String exp) {                int arrayInt[] = split(exp, "\\*");                return arrayInt[0]*arrayInt[1];    }}package com.freedom.strategy;import org.junit.Test;public class TestStrategy {    @Test    public void test() {        String exp = "3+5";        ICalculator ic = new Plus();        int result = ic.calculator(exp);        System.out.println(result);        String exp2 = "3-5";        ICalculator ic2 = new Minus();        int result2 = ic2.calculator(exp2);        System.out.println(result2);        String exp3 = "3*5";        ICalculator ic3 = new Multiply();        int result3 = ic3.calculator(exp3);        System.out.println(result3);    }}

小结:

优点:

由以上可以看出,策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

缺点:

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2. 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,需要使用享元模式来减少对象的数量才会更佳。




0 0
原创粉丝点击