代理模式 委派模式 策略模式_策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

介绍

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。

应用实例 :1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。3、JAVA AWT 中的 LayoutManager。

优点 :1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。

缺点:1、策略类会增多。2、所有策略类都需要对外暴露。

使用场景 :1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。2、一个系统需要动态地在几种算法中选择一种。3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

实现

我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。

StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。

1407a12a6ef1eda63bbaf091b99f52d4.png

步骤 1

创建一个接口。

Strategy.java

public interface Strategy {int doOperation(int num1, int num2);}

步骤 2

创建实现接口的实体类。

OperationAdd.java

public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;    }}

OperationSubstract.java

public class OperationSubstract implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;    }}

OperationMultiply.java

public class OperationMultiply implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;    }}

步骤 3

创建 Context 类。

Context.java

public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;    }public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);    }}

步骤 4

使用 Context 来查看当它改变策略 Strategy 时的行为变化。

StatePatternDemo.java

public class StrategyPatternDemo {public static void main(String[] args) {        Context context = new Context(new OperationAdd());        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));        context = new Context(new OperationSubstract());        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));        context = new Context(new OperationMultiply());        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));    }}

步骤 5

验证输出。

10 + 5 = 1510 - 5 = 510 * 5 = 50

原文链接:

https://thinkwon.blog.csdn.net/article/details/101383647

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

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

相关文章

云南计算机专业知识真题,2014年云南省事业单位考试专计算机专业知识模拟真题.doc...

2014年云南省事业单位考试专计算机专业知识模拟真题1 在Word中替换的快捷键是____。A、CTRLFB、CTRLHC、CTRLSD、CTRLP2 在Word中打印的快捷键是____。A、CTRLFB、CTRLHC、CTRLOD、CTRLP3 在Word中打开新文档的快捷键是____。A、CTRLFB、CTRLHC、CTRLOD、CTRLP4 在Word中&#…

bbb mmc_blk_probe 分析

bbb 的 emmc驱动在drivers\mmc\card\block.c,其mmc_dirver结构体如下, 根据以往平台总线驱动模型的经验来看的话,内核里应该有mmc_devices结构体,并且 其name也为"mmcblk",这样其probe函数将被调用&#x…

培智学校计算机课教案,培智数学教案

教学内容:11—20以内数的认识 写数 教学目的:1、使学生能初步地数、读、写(本节课重点看图写20以内的数。) 2、初步会写小棒图、数位表上的数,掌握20以内数的顺序。3、初步简单掌握20以内数的组成。 教学重点:学生看图会数数量并会…

例2-1

#include<stdio.h> int main(void) {printf("Hello World!\n");return 0; } 转载于:https://www.cnblogs.com/520zy/p/3348951.html

java第七章jdbc课后简答题_Java周测题08.13

1.关于Mybatis的描述正确的是&#xff1a;Mybatis是持久层框架&#xff0c;Mybatis封装了JDBC&#xff0c;Mybatis简化了代码的编辑和使用&#xff0c;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;Mybatis采用了OCP(对象关系映射)的方式封装了数据…

linux中probe函数中传递的参数来源(上)

linux中probe函数传递参数的寻找&#xff08;上&#xff09; 上一篇中&#xff0c;我们追踪了probe函数在何时调用&#xff0c;知道了满足什么条件会调用probe函数&#xff0c;但probe函数中传递的参数我们并不知道在何时定义&#xff0c;到底是谁定义的&#xff0c;反正不是我…

2018高职计算机474分排名,2018年高职分类考试招生录取分数线出炉

原标题&#xff1a;2018年高职分类考试招生录取分数线出炉记者 李洁昨天&#xff0c;实况新闻—重庆时报记者从市教育考试院获悉&#xff0c;2018年我市高等职业教育分类考试招生录取最低控制分数线已划定。一、普高类(一)普通文理类1.专本贯通分段培养项目批文史类&#xff1a…

linux中probe函数传递参数的寻找(下)

linux中probe函数传递参数的寻找&#xff08;下&#xff09; 通过追寻driver的脚步&#xff0c;我们有了努力的方向&#xff1a;只有找到spi_bus_type的填充device即可&#xff0c;下面该从device去打通&#xff0c;当两个连通之日&#xff0c;也是任督二脉打通之时。先从设备定…

服务器部署 配置jetty运行参数_Zookeeper+websocket实现对分布式服务器的实时监控...

Zookeeper简介Zookeeper是Hadoop的一个子项目&#xff0c;它是分布式系统中的协调系统。简单来说就是一个Zookeeper注册同步中心&#xff0c;内部结构为一个树形目录&#xff0c;每个节点上可以存放一定量(默认的数据量上限是1M&#xff0c;但是可以通过调整参数修改)的数据&am…

Python Interview Question and Answers

引文&#xff1a;http://ilian.i-n-i.org/python-interview-question-and-answers/ For the last few weeks I have been interviewing several people for Python/Django developers so I thought that it might be helpful to show the questions I am asking together with …

2018年海南计算机职称考试,海南省2018年全国计算机等级考试报名时间

关于延长2018年3月全国计算机等级考试报名时间的公告2018年3月全国计算机等级考试报名时间原定为2017年12月11日-26日&#xff0c;为了满足广大考生报考的需要&#xff0c;现决定将报名时间延长至2017年12月29日17&#xff1a;00。请符合报考条件的考生及时上网填报报名信息和缴…

linux中 probe函数的何时调用的?

linux中 probe函数何时调用的 所以的驱动教程上都说&#xff1a;只有设备和驱动的名字匹配&#xff0c;BUS就会调用驱动的probe函数&#xff0c;但是有时我们要看看probe函数里面到底做了什么&#xff0c;还有传递给probe函数的参数我们就不知道在哪定义&#xff08;反正不是我…

软件工程项目总结_复旦大学软件工程实验室来ASE实验室交流

2020年12月11日下午&#xff0c;复旦大学彭鑫教授一行与我院多智能体软件工程实验室开展科研工作交流。本次交流会议旨在为双方建立沟通桥梁&#xff0c;探讨研究问题&#xff0c;谋划后续合作&#xff0c;促使双方增进了解、加强互动、互相学习、共同进步。学院党委书记、多智…

windows无法发现任何计算机或设备,Win10系统提示windows无法与设备或资源通信如何解决...

最近有win10系统用户发现电脑无法打开网页&#xff0c;然后进行网络诊断的时候&#xff0c;提示“Windows无法与设备或资源(主DNS) 通信”&#xff0c;该怎么解决这样的问题呢&#xff1f;接下来给大家带来Win10系统提示windows无法与设备或资源通信的具体解决步骤。一、更改DN…

bbb u-boot mmc总线初始化分析

1. arch/arm/lib/ctr0.s .global _main _main: bl board_init_f 2. arch/arm/lib/spl.c void __weak board_init_f(ulong dummy) { board_init_r(NULL, 0); } 前两布应该还没有初始化串口&#xff0c;所以看不到打印 3. arch/arm/lib/board.c //从这个函…

scrapy 中不同页面的拼接_scrapy使用技巧总结

1. scrapy运行过程概述scrapy是一个基于python的网络爬虫框架&#xff0c;它读取对指定域名的网页request请求&#xff0c;截取对应域名的返回体&#xff0c;开发者可以编写解析函数&#xff0c;从返回体中抓取自己需要的数据&#xff0c;并对数据进行清洗处理或存入数据库。sc…

2021南京大学计算机复试线,南京大学2021年硕士研究生复试基本分数线

南京大学2021年硕士研究生复试基本分数线一、学术学位报考学科门类总分第1门第2门第3门第4门备注哲学[01]33555559090各院(系、所)综合考虑生源情况、本学科、专业人才培养特点及复试比例要求&#xff0c;根据学校复试基本分数线&#xff0c;可上调本院(系、所)复试的成绩要求。…

Buffers, windows, and tabs

If you’ve moved to Vim from an editor like Notepad or TextMate, you’ll be used to working with the idea of tabs in a text editor in a certain way. Specifically, a tab represents an open file; while the tab’s there, you’ve got an open file, as soon as y…

js如何获取计算机当前时间,js获取当前系统时间

搜索热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家&#xff0c;也给大家做个参考。var myDate new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)myDate.getMonth(); //获取…

docker访问宿主机mysql_docker容器内访问宿主机127.0.0.1服务

点击上方”技术生活“&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人背景原因分析解决方案背景已经通过docker启动的elasticsearch 服务&#xff0c;监听端口9200。在宿主机中直接通过http://127.0.0.1:9200 可以直接访问&#xff0c;但是通过docker访问缺…