策略模式(Strategy)

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。

策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

一句话来形容:准备一组算法,并将每一个算法封装起来,使得他们可以互换。
对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。

策略模式的结构

策略模式涉及到三个角色:
环境角色:持有一个Strategy类(策略类)的引用。
抽象策略角色:策略类,通常由一个接口或者抽象类实现。
具体策略角色:包装了相关的算法和行为。

java 复制代码
public interface Zhekou {
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double calcPrice(double booksPrice);
}

public class Chujihuiyuan implements Zhekou{
    public double calcPrice(double booksPrice) {
        // TODO Auto-generated method stub
        System.out.println("对于初级会员的没有折扣");
        return booksPrice;
    }
}

public class Zhongjihuiyuan implements Zhekou{
    public double calcPrice(double booksPrice) {
        // TODO Auto-generated method stub
        System.out.println("对于中级会员的折扣为10%");
        return booksPrice * 0.9;
    }
}

public class Gaojihuiyuan implements Zhekou{
    public double calcPrice(double booksPrice) {
        // TODO Auto-generated method stub
        System.out.println("对于高级会员的折扣为20%");
        return booksPrice * 0.8;
    }
}

public class Jiage {
    //持有一个具体的策略对象
    private Zhekou strategy;
    /**
     * 构造函数,传入一个具体的策略对象
     * @param strategy    具体的策略对象
     */
    public Jiage(Zhekou strategy){
        this.strategy = strategy;
    }    
    /* 计算图书的价格
     @param booksPrice    图书的原价
     @return    计算出打折后的价格
     */
    public double quote(double booksPrice){
        return this.strategy.calcPrice(booksPrice);
    }
}

public static void main(String[] args) {
	// TODO Auto-generated method stub
	//选择并创建需要使用的策略对象
	Zhekou strategy = new Gaojihuiyuan();
    //创建环境
	Jiage price = new Jiage(strategy);
    //计算价格
    double quote = price.quote(300);
    System.out.println("图书的最终价格为:" + quote);
}

电子商务系统**(策略模式的应用)**

问题**:**假设现在要设计一个贩卖各类书籍的电子商务的购物车系统

一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。比如:本网站可能对所有的教材类的图书实行每本一元的折扣;对连环画类图书提供7%的促销折扣,而对非教材类的计算机图书有3%的折扣;对其余的图书没有折扣。由于有这样复杂的折扣算法,使得价格计算问题需要系统得解决。

使用策略模式描述的话,这些不同的算法都是不同的具体策略角色,用一个NoDiscountStrategy 对象描述"算法一";用一个FlatRateStrategy 对象描述"算法二";用一个PercentageStrategy 对象描述"算法三";

为了定义出算法的等级结构。需要一个抽象策略角色作为等级结构的超类型。这个抽象策略角色由一个Java抽象类DiscountStrategy 扮演

策略模式的优缺点

优点:

1.提供了管理相关的算法族的办法。

2.提供了可以替换继承关系的办法。

3.避免使用多重条件转移语句

缺点:

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

2.造成很多的策略类。

相关推荐
二哈赛车手6 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物7 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~7 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星寂樱易李7 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
YDS8297 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆8 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
未若君雅裁9 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y9 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git