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

才发现昨天桥接模式上传的代码没通过审核,有点搞不清楚是怎么回事,也懒得问了!代码基本都贴在文章里了,虽然看似有点黑了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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值