策略模式

来源:互联网 发布:汉诺塔算法 编辑:程序博客网 时间:2024/06/16 00:36

1.策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

2.策略模式结构图
这里写图片描述

这些算法随时都可能相互替换(变化点),封装变化点是我们面向对象的一种很重要的思维方式。

3.策略模式是一种定义一系列运算的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

4.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。

4.商城收银系统
(1)具有三种优惠:打折,满返现,满积分返

(2)策略模式

//策略:抽象算法类          定义所有支持的算法的公共接口//付款方式的超类public abstract class CashSuper {    public abstract double acceptCash(double money);}//策略:具体算法Apublic class CashNormal extends CashSuper{    @Override    public double acceptCash(double money) {        return money;    }}//具体算法B//打折优惠public class CashRebate extends CashSuper{    private double moneyRebate = 1.0d;    public CashRebate(double moneyRebate){        this.moneyRebate = moneyRebate ;    }    @Override    public double acceptCash(double money) {        return money*moneyRebate;    }}//具体算法C//满300减100public class CashReturn extends CashSuper{    @Override    public double acceptCash(double money) {        //。。。省略。。。。。。。。。。        return 0;    }}
public class CashContext {    private CashSuper cs ;    //通过构造方法,传入具体的收费策略    public CashContext(CashSuper cashSuper){        this.cs = cashSuper ;    }    //根据收费策略不同,获得计算结果    public double getResult(double money){        return cs.acceptCash(money);    }}//策略模式//客户端代码public class MainTest {    public static void main(String[] args) {        CashContext c = null;        String str = ""; // 选择        switch (str) {        case "正常收费":            c = new CashContext(new CashNormal());            break;        case "满300返100":            c = new CashContext(new CashReturn());            break;        case "打8折":            c = new CashContext(new CashRebate(0.4));            break;         default:            break;        }        c.getResult(100);    }}

(3)将判断逻辑从客户端抽离,与工厂模式结合

//将判断代码从客户端移出//策略与简单工厂结合public class CashContext1 {    CashSuper cs = null ;    //参数不是具体的收费策略对象,而是一个对象,而是一个字符串,表示收费类型    public CashContext1(String type){        switch (type) {        case "正常收费":            CashNormal cs0 = new CashNormal();            cs = cs0;            break;        case "满300返100":            CashReturn cr1 = new CashReturn();            cs = cr1 ;            break;        case "打8折":            CashRebate cr2 = new CashRebate(0.9);            cs = cr2;            break;         }    }    public double getResult(double money){        return cs.acceptCash(money);    }}
public class MainTest2 {    public static void main(String[] args) {         CashContext1 csuper = new CashContext1("打8折");         csuper.getResult(100);    }}

5.
(1)策略模式的strategy类层次为context定义了一系列的可供重用的算法或行为,而且简化了单元测试,因为每个算法都有自己的类

原创粉丝点击