Java描述设计模式(22):策略模式
2023-09-11 14:14:36 时间
一、生活场景
每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。
public class C01_InScene {
public static void main(String[] args) {
// 选择满减策略,走相应的计算方式
FullReduce strategy = new Full100 ();
Payment price = new Payment(strategy);
double quote = price.payment(300);
System.out.println("最终价格为:" + quote);
}
}
/**
* 付款
*/
class Payment {
private FullReduce fullReduce ;
public Payment (FullReduce fullReduce){
this.fullReduce = fullReduce ;
}
public double payment (double totalPrice){
return this.fullReduce.getPayMoney(totalPrice) ;
}
}
/**
* 金额满减接口
*/
interface FullReduce {
double getPayMoney (double totalPrice) ;
}
/**
* 不同的满减策略
*/
class Full100 implements FullReduce {
@Override
public double getPayMoney(double totalPrice) {
if (totalPrice >= 100){
totalPrice = totalPrice-20.0 ;
}
return totalPrice ;
}
}
class Full500 implements FullReduce {
@Override
public double getPayMoney(double totalPrice) {
if (totalPrice >= 500){
totalPrice = totalPrice-120.0 ;
}
return totalPrice ;
}
}
二、策略模式
1、基础概念
策略模式属于对象的行为模式。策略模式中定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客 户端。
2、模式图解
3、核心角色
- 环境角色
持有一个Strategy策略接口角色的引用。
- 抽象策略角色
通常由一个接口或抽象类实现。此角色给出所有的具体策略类要实现的接口。
- 具体策略角色
包装相关的算法或业务流程。
4、源码实现
public class C02_Strategy {
public static void main(String[] args) {
Strategy strategy = new ConcreteStrategyB() ;
Context context = new Context(strategy) ;
context.userMethod();
}
}
/** 环境角色类 */
class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
public void userMethod (){
this.strategy.strategyMethod();
}
}
/** 抽象策略类 */
interface Strategy {
// 策略方法
void strategyMethod () ;
}
/** 具体策略类 */
class ConcreteStrategyA implements Strategy {
@Override
public void strategyMethod() {
System.out.println("策略A方法");
}
}
class ConcreteStrategyB implements Strategy {
@Override
public void strategyMethod() {
System.out.println("策略B方法");
}
}
三、策略模式总结
策略模式的关键是:变化的与不变分离,体现了“对修改关闭,对扩展开放”原则。客户端增加行为不用修改原有代码,只要添加一种策略即可,易于切换、易于理解、易于扩展。策略过多是会导致类数目庞大,变得难以维护。
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
相关文章
- Java实现 LeetCode 547 朋友圈(并查集?)
- 【java设计模式】之 工厂(Factory)模式
- JAVA转换器模式 耳机口转Type-C
- Java设计模式之建造者Builder模式代码示例
- Java设计模式之双向责任链COR模式
- Java设计模式之观察者Observer模式代码示例
- Java设计模式之组合Composite模式代码示例
- Java设计模式之工厂模式
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
- 如何写出更好的Java单例(Singleton)模式,以及单例模式的攻防源代码
- Java装饰器模式:拓展功能不改变原有结构,轻松实现定制化需求
- Java的二十三种设计模式(原型模式(Prototype))
- Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
- Java通过PDF模板导出数据 adobe acrobat的PDF编辑器 itextpdf java导出文件输出流
- java桥接模式
- java中观察者模式Observable和Observer
- 浅析JAVA设计模式之工厂模式(一)
- Java开发篇——设计模式(2)单例模式你真的了解吗?
- Java中介者模式:解密对象间的潜在火药桶
- 【java】Java线程池实现原理及业务中的实践
- 【java】Java IO体系总览