个人理解:有一个统一收口的类(策略抽象类),然后存在多种类似但又不同的功能(策略实现类),通过不同的策略找到对应的策略实现类,统一收口实现不同的具体功能,这样的设计模式就是策略模式
实际工作场景:消息推送功能,根据配置的不同消息通道(短信、邮件、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 + "元。");
}
}
输出结果
以上代码示例参考:https://blog.csdn.net/qq_39588630/article/details/80434240
实际工作使用代码后期补充!!!