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

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

策略者模式(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类就可以了,而简单工厂模式则相对耦合度要比策略模式高。
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
 

你可能感兴趣的:(软件工程,设计模式)