Java设计模式-策略模式
介绍:策略模式根据他的名字可以看出他是一套策略,策略模式就是这样,他管理着一套策略,在不同的情况下用不同的策略解决问题,各种策略之间相互独立,而且可以很灵活的替换。
例子:我们都去购物网站购买过东西,作为网站的用户,被区分为高级会员,中级会员和初级会员,当你在买东西的时候就会发现各种会员之间的优惠是不一样的,高级会员优惠最多,其次中级,初级,但是他们都是要优惠,只不过是优惠的幅度不一样。各种优惠幅度就是一套策略,具体的优惠就是对策略的具体化,我们可以根据具体情况选择适当的策略对事物进行处理。
策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。---来自百度百科
策略模式管的不是各种算法的实现,而是对这些算法如何组织调用,各种算法策略相互独立,用户可以根据实际情况调用
组成:
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。好比例子中的优惠,把这个优惠抽象出来,可以是抽象类可以是接口
—具体策略角色:包装了相关的算法和行为。例子中各种会员具体的优惠幅度
—环境角色:持有一个策略类的引用,最终给客户端调用。各种会员决定了各种优惠幅度,只一个环境
例子:
还是上面说的例子
把优惠这个行为抽象出来:
package demo_strategy; public interface Strategy { /* * price:原价*/ public abstract double saleprice(double price); }低级会员类,继承优惠这个行为:
package demo_strategy; /* *初级会员优惠折扣10% */ public class SMemeber implements Strategy { @Override public double saleprice(double price) { return price * (1 - 0.1); } }
中级会员:
package demo_strategy; /* *中级会员,折扣20& */ public class MMember implements Strategy { @Override public double saleprice(double price) { return price * (1 - 0.2); } }
高级会员:
package demo_strategy; /* *高级会员,折扣30% */ public class BMember implements Strategy { @Override public double saleprice(double price) { return price * (1 - 0.3); } }
环境类:根据所在环境选择对应的策略
package demo_strategy; public class Price { private Strategy strategy; public Price(Strategy strategy) { this.strategy = strategy; } //根据传入对象的不同,调用不同的方法,优惠策略 public double sale(double bookprice) { return strategy.saleprice(bookprice); } }
客户类(测试类):
package demo_strategy; public class Client { public static void main(String[] args) { //创建低级会员 SMemeber s = new SMemeber(); //创建中级会员 MMember m = new MMember(); //创建高级会员 BMember b = new BMember(); //运用低级会员的优惠策略 Price price1 = new Price(s); //运用中级会员优惠策略 Price price2 = new Price(m); //运用高级会员优惠策略 Price price3 = new Price(b); System.out.println("图书原价:100元"); System.out.println("低级会员价:"+price1.sale(100)); System.out.println("中级会员价:"+price2.sale(100)); System.out.println("高级会员价:"+price3.sale(100)); } }
输出:
图书原价:100元
低级会员价:90.0
中级会员价:80.0
高级会员价:70.0
优点:
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重判断语句代码看上去简单易懂但是要添加策略算法的时候代码改动量大,不易维护,不符合开闭原则
缺点:
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
参考:http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html