设计模式之策略模式详解

ops/2024/9/23 7:23:31/
策略模式
1)概述
1.概念

每一个封装算法的类被称为一种策略(Strategy)

2.定义

定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。

3.方案

将算法的定义放在专门的策略类中,每一个策略类封装了一种实现算法,使用算法的环境类针对抽象策略类进行编程,在出现新的算法时,只需要增加一个新的具体策略类即可。

4.结构图

在这里插入图片描述

5.角色

Context(环境类):环境类是使用算法的角色,它在解决某个问题时可以采用多种策略,在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

Strategy(抽象策略类):为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类、具体类或接口,环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

6.代码实现

抽象策略类

abstract class AbstractStrategy {public abstract void algorithm(); //声明抽象算法
}

具体策略类

public class ConcreteStrategyA extends AbstractStrategy {//算法的具体实现public void algorithm() {//算法A}
}

Context类

public class Context {private AbstractStrategy strategy; //维持一个对抽象策略类的引用public void setStrategy(AbstractStrategy strategy) {this.strategy= strategy;}//调用策略类中的算法public void algorithm() {strategy.algorithm();}
}

客户端类

……
Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreteStrategyA(); //可在运行时指定类型
context.setStrategy(strategy);
context.algorithm();
……
2)完整解决方案
1.结构图

在这里插入图片描述

MovieTicket充当环境类角色,Discount充当抽象策略角色,StudentDiscount、 ChildrenDiscount 和VIPDiscount充当具体策略角色。

2.代码实现
//电影票类:环境类
public class MovieTicket {private double price;private Discount discount; //维持一个对抽象折扣类的引用public void setPrice(double price) {this.price = price;}//注入一个折扣类对象public void setDiscount(Discount discount) {this.discount = discount;}public double getPrice() {//调用折扣类的折扣价计算方法return discount.calculate(this.price);}
}//折扣类:抽象策略类
interface Discount {public double calculate(double price);
}//学生票折扣类:具体策略类
public class StudentDiscount implements Discount {public double calculate(double price) {System.out.println("学生票:");return price * 0.8;}
} //儿童票折扣类:具体策略类
public class ChildrenDiscount implements Discount {public double calculate(double price) {System.out.println("儿童票:");return price - 10;}
} //VIP会员票折扣类:具体策略类
public class VIPDiscount implements Discount {public double calculate(double price) {System.out.println("VIP票:");System.out.println("增加积分!");return price * 0.5;}
}

客户端类

public class Client {public static void main(String[] args) {MovieTicket mt = new MovieTicket();double originalPrice = 60.0;double currentPrice;mt.setPrice(originalPrice);System.out.println("原始价为:" + originalPrice);System.out.println("---------------------------------");Discount discount;discount = new ChildrenDiscount(); mt.setDiscount(discount); //注入折扣对象currentPrice = mt.getPrice();System.out.println("折后价为:" + currentPrice);}
}
3)总结
1.优点
  • 可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。

  • 可以避免多重条件选择语句。

  • 提供了一种算法的复用机制,可以方便地复用这些策略类。

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

  • 将造成系统产生很多具体策略类,任何细小的变化都将导致系统要增加一个新的具体策略类。

  • 无法在客户端同时使用多个策略类。

3.适用场景
  • 系统需要动态地在几种算法中选择一种。

  • 对象有很多行为,如果不用恰当的模式,则只能使用多重条件选择语句来实现。

  • 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法与相关的数据结构,可以提高算法的保密性与安全性。


http://www.ppmy.cn/ops/7412.html

相关文章

MyBatis Dynamic SQL基本使用

MyBatis Dynamic SQL基本使用 一、概念二、特性Hamcrest是什么 三、MyBatis Dynamic SQL 快速入门3.1 环境准备3.2 定义表和列3.3 创建 MyBatis3 映射器3.4 使用 MyBatis3 执行 SQL 四、数据库对象表示4.1 表或视图表示4.2 表别名4.3 列表示 五、Where 子句支持5.1 简单的 wher…

密码学 | 椭圆曲线数字签名方法 ECDSA(下)

目录 10 ECDSA 算法 11 创建签名 12 验证签名 13 ECDSA 的安全性 14 随机 k 值的重要性 15 结语 ⚠️ 原文:Understanding How ECDSA Protects Your Data. ⚠️ 写在前面:本文属于搬运博客,自己留着学习。同时,经过几…

vue3表单参数校验+正则表达式

我们的表单中有用户名、密码、电话号码、邮箱这四个项。 我们设置用户名为3到20位的非空字符 密码为3到25位非空字符 电话号码就用目前用的电话号码正则表达式,要求手机号码以 1 开头,第二位为 3 到 9 之间的数字,后面跟着任意 9 个数字&a…

灵构Lingo AI:智能伙伴,创意与效率的融合

目录 功能部分 AI笔记:创意文案与读书笔记的智能生成 AI对话:趣味生活与笑话分享 AI阅读:学习助手与论文总结 AI画图:艺术家般的场景绘制

排序 “叁” 之交换排序

目录 1. 基本思想 2.冒泡排序 2.1 基本思想 2.2 代码示例 2.3 冒泡排序的特性总结 3.快速排序 3.1 基本思想 🌵hoare版本 🌵挖坑法 ​编辑 🌵前后指针版本 ​编辑 3.2 快速排序优化 🌻三数取中法选key 3.4 快速排序…

无人机--行业市场分析

市场规模:无人机行业市场规模在近年来不断扩大,预计未来几年将持续增长。根据不同的研究机构数据,全球无人机市场规模预计将从2018年的101亿美元增长到2023年的266亿美元,年复合增长率达21.4%。其中,民用无人机市场规模约占37%&am…

分布式锁选型指南:Redis与ZooKeeper的较量与融合

一、引言 在构建高并发、分布式系统时,为确保数据的一致性和完整性,分布式锁成为必不可少的同步机制。其中,Redis与ZooKeeper作为两大主流的分布式锁实现方案,各自具有鲜明特点和适用场景。本文将深入剖析Redis与ZooKeeper在实现…

【AI 测试】分词器

目录 概念分词器种类主要应用场景几种常用的分词器适合用于自然语言处理任务的分词器分词器使用实例概念 分词器(Tokenizer)是一种自然语言处理工具,其核心功能是将连续的自然语言文本切分为一系列有意义的词汇单元。这些词汇单元通常是词或短语,它们在语言学上具有一定的…