策略模式

Posted chen-ying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。



一、策略模式:
  如果说简单工厂模式对对象分类,
  那么策略模式就是对相似逻辑算法分类,
  将算法的切换变成一个目标可变的行为,
  由策略决定行为。

二、基本思路:
  1.创建策略抽象类,定义所有支持的算法的公共接口;
  2.继承抽象类,策略具体化;
  3.定义Context类作为上下文承接的角色,是使用了某种策略的类,通过策略改变自身行为。

三、简单样例:
  以简单收银软件为例,灵活解决原价、打折、返现、返积分等问题。
/**
 * 策略抽象类
 * 定义收费抽象方法
 */
 abstract class CashSuper
    public abstract double acceptCash(double money);
/**
 * 具体策略的实现
 * 将收费方式具体化,例如按照原价,或者打折或者满价返现等等
 */
//正常收费
class CashNormal extends CashSuper
    @Override
    public double acceptCash(double money) 
        return money;
    


//打折收费
class CashRebate extends CashSuper
     private double cashRebate=1;
     CashRebate(double moneyRebate)//传入折扣率,之前初始化为1
         this.cashRebate=moneyRebate;
     

    @Override
    public double acceptCash(double money) 
        return money*cashRebate;//折扣后
    


//收费返利
class CashReturn extends CashSuper
     private double cashCondition=0;
     private double cashReturn=0;

     //满cashCondition,送cashReturn
     CashReturn(double cashCondition, double cashReturn)
         this.cashCondition=cashCondition;
         this.cashReturn=cashReturn;
     

    @Override
    public double acceptCash(double money) 
         double result=money;
         if (money>=cashCondition)
             result=money-Math.floor(money/cashCondition)*cashReturn;
         
        return result;
    
/**
 * 接收具体策略,并产生不同的行为
 * 根据收费策略,决定费用计算方法
 */
class Context
    private CashSuper cashSuper;

    //通过构造方法传入具体的收费策略
    public Context(CashSuper cashSuper)
        this.cashSuper=cashSuper;
    

    public double getResult(double price)
        //根据收费策略的不同,用不同的计算方法获得具体收费金额。
        return cashSuper.acceptCash(price);
    
/**
 * 选择策略
 * 客户端选择收费方法,即可得到响应的结果,
 * 具体算法已经跟客户程序隔离
 */
class Main

    public static Context chooseStrategy(String type)
        Context context=null;
        //根据收费类型不同,将相应的策略对象传入Context中,
        // 之后Context将产生对应行为,最终得出结果
        switch (type) 
            case "正常收费":
                context = new Context(new CashNormal());
                break;
            case "打8折":
                context = new Context(new CashRebate(0.8));
                break;
            case "满300返100":
                context = new Context(new CashReturn(300, 100));
                break;
            default:
                break;
        
        return context;
    
    public static void main(String[] args) 
        double single=12;//单价
        double num=3;//数量
        double totalPrice=0;//总价

        Context context=null;
        String[] types="正常收费","打8折","满300返100";
        context=chooseStrategy(types[1]);

        //进行计算
        totalPrice=context.getResult(single*num);
        System.out.println("应收费:"+totalPrice);
    

 

以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

策略模式(Strategy Pattern)

spring中如何使用策略模式

策略模式

设计模式中的多态——策略模式详解

java设计模式---策略模式(案例解析)

设计模式——策略模式