策略模式
定义了一系列的算法,分别封装起来,让他们之间可以互相替换。此模式让算法的改变不会影响到使用算法的客户。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
这个模式涉及到三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
下面通过一个例子加深理解
描述:最近王者荣耀迎来了一次优惠活动,玩家登陆游戏抽取专属优惠折扣,比如韩信教廷特使88元:那么现在不同的用户如果买此皮肤还需花费多少呢?
定义策略接口
public interface Strategy { double reRate(); }
用户A(实现接口获取专属折扣)
public class UserA implements Strategy { @Override public double reRate() { return 0.5; } }
用户B(实现接口获取专属折扣)
public class UserB implements Strategy { @Override public double reRate() { return 0.8; } }
环境角色content
public class Content { Strategy strategy; public Content(Strategy strategy){ this.strategy=strategy; } public double getRate(){ return strategy.reRate(); } }
客户端
public class MainTest { /** * 比如说一款皮肤88元,那么针对2个用户最终需要付多少呢 */ public static void main(String[] args){ int total = 88; double result; Content content; //客户a content = new Content(new UserA()); result = total*content.getRate(); System.out.println("A用户所需钱数="+result); //客户b content = new Content(new UserB()); result = total*content.getRate(); System.out.println("B用户所需钱数="+result); } } 结果 A用户所需钱数=44.0 B用户所需钱数=70.4
策略模式的优点
策略模式使开发人员能够开发出由许多可替换 的部分组成的软件,并且各个部分之间是弱连接 的关系
弱连接的特性使软件具有更强的可扩展性 ,易于维护 ;更重要的是,它大大提高了软件可重用性 。
策略模式的缺点
客户端必须知道所有的策略类,并自行决定使用哪个策略类。
造成很多的策略类
解决办法 -- 使用工厂模式