《一天聊一个设计模式》 策略

9. 策略(Strategy)

Intent

定义一系列算法,封装每个算法,并使它们可以互换。

策略模式可以让算法独立于使用它的客户端。

Class Diagram

  • Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
  • Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。
    在这里插入图片描述

与状态模式的比较

状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。

状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。

Implementation

设计一个鸭子,它可以动态地改变叫声。这里的算法族是鸭子的叫声行为。

public interface QuackBehavior {void quack();
}
public class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("quack!");}
}
public class Squeak implements QuackBehavior{@Overridepublic void quack() {System.out.println("squeak!");}
}
public class Duck {private QuackBehavior quackBehavior;public void performQuack() {if (quackBehavior != null) {quackBehavior.quack();}}public void setQuackBehavior(QuackBehavior quackBehavior) {this.quackBehavior = quackBehavior;}
}
public class Client {public static void main(String[] args) {Duck duck = new Duck();duck.setQuackBehavior(new Squeak());duck.performQuack();duck.setQuackBehavior(new Quack());duck.performQuack();}
}
squeak!
quack!

JDK

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()

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

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

相关文章

如何在eclipse jee中创建Maven project并且转换为Dynamic web project

转自:http://www.javaniu.com/maven-jee-dynamic-web-project.htm 注意:该文档只针对以下eclipse版本,如图 一.在eclipse的官方站点下载eclipse jee版本,地址http://www.eclipse.org/downloads/download.php?file/technology/epp/downloads/release/ind…

《一天聊一个设计模式》 抽象工厂

4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 。 Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起…

精华Java问题总结

当时在网上汇总了不知多少面试和基础题,弄了个精华总结。 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类…

复习Java的精华总结

小白和老手都应该看看的总结 输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法: Scanner s new Scanner(System.in); 使用方法如下: //对应类型用对应的方法接…

超硬核!躺进BAT以后我总结了出现最多的15道数组题

作为一个硬核作者,绝不和你扯废话,干货无套路送你 题目一: 给定一个数组arr,求出需要排序的最短子数组长度 要求: 时间o(n),空间o(1) 思路: 有序的数组中,任意一个数字,一定小于左…

《关于我的那些面经》滴滴Java岗(附答案)

手撕单例模式 所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。 在Java,一般常用在工具类的实现或创建对象需要消耗资源。特点:类构造器私有、持有自己类型的属性、对外提供获取实…

《关于我的那些面经》——百度后端(附答案)

作者保证,本系列全是纯干货真实记录,绝对不是某些营销号瞎编乱造的面试。 一、公司的简介 百度是全球最大的中文搜索引擎,是中国最大的以信息和知识为核心的互联网综合服务公司,更是全球领先的人工智能平台型公司。2000年1月1日创…

《兔兔公司的历史》那些年,百度的荣耀和沉沦

这是全站最硬核的兔子700文章后的第一篇软文,觉得喜欢的同学可以三连一波,如果大家喜欢,我会出公司的历史系列、互联网大佬系列、产品经理系列,大家喜欢哪个呢? 百度公司的发展趋势 还记得南宋词人辛弃疾的那首词吗&a…

这篇不讨好任何人的回忆录,记录了我从双非学校到BAT/TMD六offer的原因

注:给我想个新名字好不好呀,采用了直接发百元红包!没别的,想让大家认识兔兔rabbit,说一下自己的经验教训,应该会对很多人有帮助。 一、前言 在今年,我要毕业了,基本结束了大学生活&…

《兔子的大厂面经合集》朋友面神策数据库,第五个问题不会,直接再见(1)

这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 写数据库还真不是人人都能干的,硬是一道别的题都没问。

兔子,撒币

作为最硬核的你兔老大,我狠起来连自己都骂 一、原力第一 哈哈当然不是骂自己啦哈哈,其实是最近csdn出了一个活动:原力计划s3,弄得我现在整天想着,给你们发钱。发书。发资料。 对,就是这个玩意&#xff1a…

超硬核!数据库学霸笔记,考试/面试随便秒杀

废话不多说,上干货是兔老大的传统了,收藏就完事了。 目录 数据库系统概论 四个基本概念 数据模型 数据库系统结构 数据库系统模式的概念 数据库系统的三级模式结构 数据库的二级映像功能与数据的独立性 数据库系统的组成 关系 关系模式 关系数…

腾讯面试Android必问11题,我说的,不信就来看看

众所周知兔子啥都会那么一点,不收藏等着干啥呢 1、是否使用过本地广播,和全局广播有什么差别? 引入本地广播的机制是为了解决安全性的问题: 正在发送的广播不会脱离应用程序,比用担心app的数据泄露;其他的…

超硬核!我统计了BAT笔试面试出现频率最高的五道题,学会了总能碰到一道

所以说不要怕算法,简单的题反而出现的频率最高,不一定非要写个几百道才面试 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会…

不骗你,全网首创的超硬核的万字SQL题

因为上次发了数据库原理总结,浏览快上万了,所以把我总结的题目 也送给大家 上次的数据库原理总结 一.根据员工工资计算其个人所得税,3000元为起征点,超出3000元的部分按照10%的比例征收个人所得税,例如&…

学姐腾讯产品面经

顺利拿到sp offer,不服不行,不是这块料呀 系列文章历史: 朋友面神策数据库,第五个问题不会,直接再见 美女学姐面了美团阿里京东,这些经验实在太真实了 首先,来个背景介绍: 腾讯实…

关于阿里云服务器本地访问不了的问题

一:前几天公司购买了一台阿里云服务器,让我把之前的项目都移到阿里云服务器上,我为此专门的研究了一下阿里云服务器的基本操作和安装流程,这里我说一下我们公司的服务器配置如下: 系统就配置就是这个情况,下…

超硬核!十万字c++题,让你秒杀老师和面试官(上)

我发现呀,这大家对面试题的需求还是很大的,这里总结了上千道知识点,能换您一个收藏吗 C 引用和指针的区别? 指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。 引用在定义的时候…

当年,学姐把这份Java总结给我,让我在22k的校招王者局乱杀

可以说,学姐给我的这份文档真的把我的知识查漏补缺,面试问到了好多,值得收藏。 并发编程 一.Executor 为什么使用线程池:手动创建线程耗费性能,不利于管理。 首先创建线程池有两种方式:使用Executors工厂…

测试必经之路(探索性测试)

接下来,百万年薪测试方面也会有专题哦。 测试计划: 测试范围、方法、资源、进度、风险 测试报告: 就是把测试的过程和结果写成文档,对发现的问题和缺陷进行分析。 一、探索性测试 评估测试用例的标准 1 测试用例对被测对象的…