java设计模式——策略者模式(strategy)

来源:互联网 发布:铜掌柜理财安全吗 知乎 编辑:程序博客网 时间:2024/05/01 02:12

今天学习了策略者模式,在此做下学习笔记,有什么问题请大家帮忙指出来,不胜感激,谢谢~

策略者模式(Strategy)是一种定义一系列算法的方法。从概念上来看,所有这些算法完成的都是 相同的工作,只是实现不同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合[DPE] 策略者模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出 这些算法中的公共功能[DP]。

当不同的行为放在一个类时,该类就包含了很多不同的算法,就需要要if或者switch语句来选择适应的行为,因此,策略者模式选择将这不同算法的类封装为不同的类,每一个算法对应一个类来消除分支判断,这样可以提高系统的维护。

就商场收银系统来说,需要有很多种情况,有时候商场要做活动打折,有时候是满100送10,有时候是满一百送100积分等等一系列情况,为了避免大量的判断需要把各种不同的算法放在各自不同的类。“策略者模式封装了变化”——策略者模式就是用来封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

uml图如下:



示例代码如下:

StrategyDemo主类:

public class StrategyDemo {    /**     * @param args the command line arguments     */    public static void main(String[] args) {        // TODO code application logic here        //每件物品打7.5折        final double rad=0.75;         final double price = 123;        CashContext cnt = new CashContext(new CashRebate(rad));        System.out.println("打完折后的价钱是:"+cnt.AlgrothmCash(price));       }}
CashSuper接口public interface CashSuper {    public double GetCash(double price);//定义获取做完活动后的价格}


//以下是不同的活动
CashNormal类public class CashNormal implements CashSuper{    @Override    public double GetCash(double price) {        //没做活动,返回原来值        return price;    }    }CashRebate类:public class CashRebate implements CashSuper{//打折活动    private double radio;    public CashRebate(double rad)    {        radio = rad;    }    @Override    public double GetCash(double price) {        return radio*price;    }}CashReturn类:public class CashReturn implements CashSuper{    private int ShoppingCash;    private int ReturnCash;    //现金返还,满几百返还几百    public CashReturn(int ShoppingCash,int ReturnCash)    {        this.ReturnCash = ReturnCash;        this.ShoppingCash = ShoppingCash;    }    @Override    public double GetCash(double price) {        if(price>=ShoppingCash)        {            price -= ReturnCash;        }        return price;    }    }
CashContext类,来调用对应的对象
CashContext类:public class CashContext {    CashSuper Cash;    public CashContext(CashSuper cashSuper) {        Cash = cashSuper;    }    public double AlgrothmCash(double price) {        return Cash.GetCash(price);    }}
想想策略模式与简单工厂模式有什么不同呢?
仔细的比对了一下,发现策略模式降低了耦合度,封装得更彻底,只需要知道CashContext类就可以了,而简单工厂模式则相对耦合度要比策略模式高。
	
				
		
原创粉丝点击