设计模式之策略模式笔记

设计模式之策略模式笔记

  • 说明
  • Strategy(策略)
  • 目录
  • 策略模式示例类图
    • 抽象策略类
    • 策略A类
    • 策略B类
    • 策略C类
    • 促销员类
    • 测试类

说明

记录下学习设计模式-策略模式的写法。JDK使用版本为1.8版本。

Strategy(策略)

意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。
结构:
在这里插入图片描述

其中:

  • Strategy(策略)定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
  • ConcreteStrategy(具体策略)以Strategy接口实现某具体算法。
  • Context(上下文)用一个ConcreteStrategy对象来配置:维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据。

适用性:

  • 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。

目录

在这里插入图片描述

策略模式示例类图

在这里插入图片描述

以该UML类图实现策略模式示例。

抽象策略类

package com.example.deesign_patterns.strategy;//抽象策略类
public interface Strategy {void show();
}

策略A类

package com.example.deesign_patterns.strategy;//具体策略类,封装算法
public class StrategyA implements Strategy{@Overridepublic void show() {System.out.println("买一送一");}
}

策略B类

package com.example.deesign_patterns.strategy;//具体策略类,封装算法
public class StrategyB implements Strategy{@Overridepublic void show() {System.out.println("满200元减50元");}
}

策略C类

package com.example.deesign_patterns.strategy;//具体策略类,封装算法
public class StrategyC implements Strategy{@Overridepublic void show() {System.out.println("满1000元加一元换购任意200元以下商品");}
}

促销员类

package com.example.deesign_patterns.strategy;//促销员类
public class SalesMan {//聚合策略对象private Strategy strategy;public SalesMan(Strategy strategy) {this.strategy = strategy;}public Strategy getStrategy() {return strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}//由促销员展示促销活动给用户public void salesManShow(){strategy.show();}
}

测试类

package com.example.deesign_patterns.strategy;//测试类
public class Client {public static void main(String[] args) {//春天来了,使用春节促销活动SalesMan salesMan=new SalesMan(new StrategyA());//展示促销活动salesMan.salesManShow();System.out.println("===================");//中秋节到了,使用中秋节促销活动salesMan.setStrategy(new StrategyB());//展示促销活动salesMan.salesManShow();System.out.println("===================");//圣诞节到了,使用圣诞节促销活动salesMan.setStrategy(new StrategyC());//展示促销活动salesMan.salesManShow();}
}

在这里插入图片描述

好处:

  • 策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。
  • 易于扩展。增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合开闭原则。
  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过享元模式在一定程度上减少对象的数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/348.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uncaught TypeError: Illegal invocation

使用console.time报错 console.time将在当前对象(即支持)的上下文中执行,发现一些老的chrome版本中,上下文可能有问题. 解决: 可以使用 console.time.call(window,1111)

把网页地址中的url的参数转化为obj

1.例子: var str"http://www.hqyj.com/index.html?uid123&page19&dt20230407&namekaren" 2.代码: var str"http://www.hqyj.com/index.html?uid123&page19&dt20230407&namekaren"function fn (str) {var arr1str.split("…

opencv编译

文章目录 一、编译前工作二、编译安装1、Windows2、Linux 一、编译前工作 进入下载页面https://github.com/opencv/opencv,下载指定.tar.gz源码包,例如:opencv-4.7.0.tar.gz。解压到指定目录。 二、编译安装 opencv构建时,需要…

Visual C++中*号位置和功能详细解说

我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊Visual C中*号的位置。 我知道在程序员队伍中有一群特别细心、谨慎的可爱的人,他们经常为一些在别人看来小的不能再小的问题所困惑。比如说,*号的位置,让很多人…

Appium安装部署

目录 一、检查Java环境 二、安装android SDK 一、检查Java环境 Android SDK依赖ava环境,因此需要先安装jdk。在CMD中输入java -version 出现下图的结果,说明当前环境已安装jdk 如果提示java命令无效,请安装后进行下一步。 二、安装androi…

ModaHub AI模型社区:向量数据库CPU 版 Milvus和GPU 版 Milvus 版本比较

目录 CPU 版 Milvus 版本比较 概述 CPU 版 Milvus 支持的索引类型 浮点型向量 二值型向量 GPU 版 Milvus 版本比较 概述 GPU 版 Milvus 支持的索引类型 浮点型向量 二值型向量 CPU 版 Milvus 版本比较 概述 Milvus 提供两个发行版本:CPU 版本和 GPU 版本…

Unix/Linux编程:UDS 流(Stream)

〇、前言 socket 是一种 IPC (Inter-Process Communication,进程间通信)方法,它允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据。通过使用Socket,开发人员可以…

解决不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接的问题

问题概述: 用windows server 2012 r2 vl x64搭了个文件服务器,在使用时有个问题,老是用户登录有问题,提示“不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接”。出现的原因不详,网上也没查到合理的…

路由器的工作原理详解

什么叫路由? 路由器的英文是 Router,也就是「找路的工具」。找什么路?寻找各个网络节点之间的路。 换句话说,路由器就像是快递中转站,包裹会经过一个个的中转站,从遥远的地方寄到你家附近,数据…

基于深度学习的高精度袋鼠检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度袋鼠检测识别系统可用于日常生活中或野外来检测与定位袋鼠目标,利用深度学习算法可实现图片、视频、摄像头等方式的袋鼠目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

【软件开发】MyBatis 理论篇

MyBatis 理论篇 1.MyBatis 是什么? MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。…

【机器学习】sklearn数据集的使用,数据集的获取和划分

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 sklearn数据集 二、安装sklearn二、获取数据集三、…