Java设计模式-策略模式

来源:互联网 发布:软件系统可靠性设计 编辑:程序博客网 时间:2024/06/01 09:23

介绍:策略模式根据他的名字可以看出他是一套策略,策略模式就是这样,他管理着一套策略,在不同的情况下用不同的策略解决问题,各种策略之间相互独立,而且可以很灵活的替换。

例子:我们都去购物网站购买过东西,作为网站的用户,被区分为高级会员,中级会员和初级会员,当你在买东西的时候就会发现各种会员之间的优惠是不一样的,高级会员优惠最多,其次中级,初级,但是他们都是要优惠,只不过是优惠的幅度不一样。各种优惠幅度就是一套策略,具体的优惠就是对策略的具体化,我们可以根据具体情况选择适当的策略对事物进行处理。

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


策略模式管的不是各种算法的实现,而是对这些算法如何组织调用,各种算法策略相互独立,用户可以根据实际情况调用

组成:

抽象策略角色: 策略类,通常由一个接口或者抽象类实现。好比例子中的优惠,把这个优惠抽象出来,可以是抽象类可以是接口
具体策略角色:包装了相关的算法和行为。例子中各种会员具体的优惠幅度
环境角色:持有一个策略类的引用,最终给客户端调用。各种会员决定了各种优惠幅度,只一个环境

例子:

还是上面说的例子

把优惠这个行为抽象出来:

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美的空调显示e3怎么办 发现安装空调条码被撕怎么办 删除了国美安装码怎么办 海信空调保修卡丢了怎么办 海尔空调保修卡丢了怎么办 科龙空调不制冷怎么办 魅族s6屏幕碎了怎么办 格力空调化霜怎么办 一开空调就跳闸怎么办 洗衣机顶盖的安全开关损坏怎么办 苹果平板电脑拍照坏了怎么办 苹果hom键不灵了怎么办 平板电脑home键发烫怎么办 华为平板无法输入资料怎么办 安卓平板没声音怎么办? 平果手机充不了电怎么办 苹果6s用电太快怎么办 平板充不起电了怎么办 日本买的电器国内售后怎么办 海淘地址试投不成功怎么办 怀孕了吐得厉害怎么办 玩网页游戏好卡怎么办 网页游戏占cpu高怎么办 微信有余额绑定其他名下怎么办 银行卡绑定支付余额不对怎么办 可乐机不制冷了怎么办 被淘宝卖家威胁怎么办 征信不好想贷款怎么办 急用钱征信不好怎么办 急用钱逾期不还怎么办 急用钱借款不还怎么办 做b超按压疼痛怎么办 做b超没有尿怎么办 b超憋不到尿怎么办 做b超前没有尿意怎么办 肝胆b超前喝水了怎么办 肝胆彩超喝水了怎么办 胆囊b超喝了水怎么办 系统b超照不到怎么办 思维彩超宝宝不动怎么办 怀孕七个月胎儿缺氧怎么办