设计模式之"策略模式"

个人理解:有一个统一收口的类(策略抽象类),然后存在多种类似但又不同的功能(策略实现类),通过不同的策略找到对应的策略实现类,统一收口实现不同的具体功能,这样的设计模式就是策略模式

实际工作场景:消息推送功能,根据配置的不同消息通道(短信、邮件、APP、站内消息等),推送不同的消息通知。统一收口就是消息发送的send(String channel)方法,根据不同的消息通道,创建不同的消息发送实现类(策略实现类)发送对应的消息,这样就形成了简单的一个策略模式

简单学习案例:现金支付功能,提供一个支付的功能pay(double money)方法,根据不同的活动情况(正常支付、满减支付、打折支付),最终算出支付的金额。

标准解释
1.策略模式概述:
策略模式(Pattern:Strategy)属于行为型模型,是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2.策略模式包含的角色及其职责:
(1)抽象策略角色[Strategy]:策略类,定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,
Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
(2)具体策略类[ConcreteStrategy]:实现了Strategy定义的接口,包装了相关的算法和行为,提供具体的算法实现。
(3)上下文角色[Context]:持有一个策略类的引用,最终给客户端调用。
①需要使用ConcreteStrategy提供的算法。
②内部维护一个Strategy的实例。
③负责动态设置运行时Strategy具体的实现算法。
④负责跟Strategy之间的交互和数据传递。

针对学习案例是参考别人的,代码如下:
策略抽象类

package com.example.designmode.strategy;
/**
 * 抽象策略角色
 * 现金收费抽象类
 * */
public abstract class CashSuper {
    // 现金收费超累的抽象方法,收取现金,参数为原价,返回值为当前价
    public abstract double acceptCash(double money);
}

策略实现类

package com.example.designmode.strategy;

/**
 * 具体策略实现类
 * 正常收费子类  继承现金收费抽象类
 * */
public class CashNormal extends CashSuper{

    @Override
    public double acceptCash(double money) {
        // 正常收费返回原价
        return money;
    }
}

========================================================================================================

package com.example.designmode.strategy;

/**
 * 具体策略实现类
 * 打折收费子类,继承现金收费抽象类
 * */
public class CashRebate extends CashSuper{

    private double moneyTebate = 1;

    public CashRebate(double moneyTebate) {
        // 打折收费 初始化是必须传入折扣率  如:八折  传入0.8
        this.moneyTebate = Double.valueOf(moneyTebate);
    }

    @Override
    public double acceptCash(double money) {
        return money*moneyTebate;
    }
}

========================================================================================================

package com.example.designmode.strategy;

/**
 * 具体策略实现类
 * 返利收费子类,继承现金收费抽象类
 * */
public class CashReturn extends CashSuper {

    private double moneyCondition = 0; // 返利条件
    private double moneyReturn = 0; // 返利值

    // 返利收费 初始化时必须输入返利条件和返利值 如满300返100
    public CashReturn(double moneyCondition, double moneyReturn) {
        this.moneyCondition = Double.valueOf(moneyCondition);
        this.moneyReturn = Double.valueOf(moneyReturn);
    }

    @Override
    public double acceptCash(double money) {
        if (money >= moneyCondition) {
            return money-Math.floor(money/moneyCondition)*moneyReturn;
        }
        return money;
    }
}

功能测试类

package com.example.designmode.strategy;

public class Test {

    // https://blog.csdn.net/qq_39588630/article/details/80434240

    public static void main(String[] args) {
        int number = 300; //商品数量
        int price = 10; //商品单价
        Normal(number, price); //正常收费
        Rebate(number, price); //打折收费
        Return(number, price); //满减收费
    }

    public static void Normal(int number, int price) {
        CashContext ccNormal = new CashContext("正常收费");
        double result = ccNormal.getResult(number*price);
        System.out.println("正常收费:商品单价为:" + price + "元,商品数量为:" + number + "件,应付款:" + result + "元。");
    }

    public static void Rebate(int number, int price) {
        CashContext ccRebate = new CashContext("打折收费");
        double result = ccRebate.getResult(number*price);
        System.out.println("打折收费:商品单价为:" + price + "元,商品数量为:" + number + "件,应付款:" + result + "元。");
    }

    public static void Return(int number, int price) {
        CashContext ccReturn = new CashContext("满减收费");
        double result = ccReturn.getResult(number*price);
        System.out.println("打折收费:商品单价为:" + price + "元,商品数量为:" + number + "件,应付款:" + result + "元。");
    }
}

输出结果

image.png

以上代码示例参考:https://blog.csdn.net/qq_39588630/article/details/80434240


实际工作使用代码后期补充!!!

你可能感兴趣的:(设计模式之"策略模式")