状态模式和策略模式的区别

区别主要体现在行为上,而不是结构上,所以,看时序图就能很好的看出两者的区别。

状态模式

image

看1.4,状态B是状态A创建的,也就是由系统本身控制的。调用者不能直接指定或改变系统的状态转移

所以,状态是系统自身的固有的,调用者不能控制系统的状态转移。比如,一个请假单有“部长审批”-“经理审批”-“审批通过”-“审批不通过”等状态,请假者没有办法将一个部长都还没审批完的请假单提交给经理,这个状态转换只能系统自己完成。

策略模式

image

看1.5,策略B是调用者指定的,系统自身并不能指定或改变策略。

所以策略是外界给的,策略怎么变,是调用者考虑的事情,系统只是根据所给的策略做事情。这时系统很像是一台电脑,根据指令执行动作,打一鞭子滚一滚。

知识检测

小明中国出发到日本再到美国去旅行,在不同的国家都要做两件事,问候和打招呼,怎么做取决于他在哪个国家。(就是编程时经常碰到的多语言问题了)根据需求,请问该使用哪种模式?开发者写了下面的代码,请问下面的代码是状态模式还是策略模式?

public class GreetingContext {private Country country;public GreetingContext(Country country){this.country = country;}public void changeCountry(Country country){this.country = country;}public void sayHello(){country.sayhello();}public void greet(){country.greet();}}//国家接口
public interface Country {void sayhello();void greet();
}//中国
public class China implements Country {public void sayhello() {System.out.println("你好!");}public void greet() {System.out.println("握手!");}
}//美国
public class America implements Country {public void sayhello() {System.out.println("hello!");}public void greet() {System.out.println("kiss");}
}//调用
public class Client {public static void  main(String[] args){GreetingContext context = new GreetingContext(new China());context.sayHello();context.greet();context.changeCountry(new America());context.sayHello();context.greet();}
}

参考:状态模式和策略模式的比较

图片来自:图说设计模式

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

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

相关文章

如何截获打印机文件_打印、复印还不会,如何在办公室里混?全程详细教学

我们在职场中,经常需要用到打印机,相信很多人都还不会打印、复印文件,求人不如求己,今天就来详细教学,一起来学习吧。如何使用打印机?首先用一根电源线和一根USB线,将电脑主机与打印机连接&…

外观模式案例分析

策划案 要实现选中和未选中功能&#xff1a; 未选中状态&#xff1a;点击图形进入选中状态 选中状态&#xff1a;点击<按钮进入未选中状态 实现代码 请问这是什么模式&#xff1f; import TransformController from ./TransformController //操作框控制器类 import To…

UICollectionView reloadData后cell被隐藏

在使用UICollectionView的页面执行: [self.collectionView reloadData]; 执行后&#xff0c;页面变为空白页&#xff0c;调试发现&#xff0c;执行reloadData 后UICollectionView的cell的hidden都变为YES. stackoverflow上很多人说这是UICollectionView的一个bug, 有人给出了解…

len在python_len在python

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

【leetcode❤python】172. Factorial Trailing Zeroes

#-*- coding: UTF-8 -*-#给定一个整数N&#xff0c;那么N的阶乘N&#xff01;末尾有多少个0&#xff1f; 比如&#xff1a;N10&#xff0c;N&#xff01;3628800,N&#xff01;的末尾有2个0。#所有的尾部的0可以看做都是2*5得来的&#xff0c;所以通过计算所有的因子中2和5的个…

input ios问题 小程序_小程序可以解决哪些问题??

小程序是近几年移动互联网领域的热点&#xff0c;随着移动互联网在消费端逐渐进入到了存量时代&#xff0c;小程序成为了互联网平台向各个领域垂直发展的重要策略&#xff0c;而广大的中小创业者要想充分利用大型互联网平台的流量资源&#xff0c;小程序也是一个非常重要的渠道…

切换dns批处理模板

网速慢有时候是dns造成的。我们默认使用公司的dns&#xff0c;公司很可能只有两台dns服务器&#xff0c;很容易成为单点&#xff0c;当访问人数多的时候&#xff0c;延迟会变高&#xff0c;所以网址解析很慢&#xff0c;上网就慢。 可以设置成阿里的dns,有些情况下就会变快。但…

怎么快速写python自动化脚本_自动化脚本如何编写?

首先&#xff0c;我们看一个视频 &#xff0c;通过视频&#xff0c;了解下什么是自动化脚本 。这个是我用auto.js写的一个 抖音自动养号脚本 。大体功能就是自动私信&#xff0c;评论&#xff0c;关注 &#xff0c;有兴趣可以先去一下链接了解 。目前编写自动化脚本的语言主要有…

在output 子句和 scope_identity() 混合使用的时候的注意事项

无意睹到一篇旧文档 SR0008&#xff1a;考虑使用 SCOPE_IDENTITY 代替 IDENTITY &#xff1a;https://msdn.microsoft.com/zh-cn/library/dd172121(vvs.100).aspx 日常开发&#xff0c;我们如果在插入记录的同时需要返回插入的IdentityID,通常我们会使用 Identity 和使用函数 S…

从setTimeout,onclick传参看js函数作为参数

setTimeout传参 我们最先想到是这样&#xff1a; setTimeout(doSomething1(123),1000);function doSomething1(content){console.log(content); } 但是这样写&#xff0c;123立马打印出来&#xff0c;并没有等待1s。这是因为&#xff0c;这样写会直接调用doSomething1(123),…

linux上的那些查找的命令

由于工作的需要&#xff0c;少不得要在linux系统上查找各种各样的文件&#xff0c;关于在linux查找的命令有不少&#xff0c;这里小小的总结下。 简单介绍下各个命令的用途&#xff1a; find&#xff1a;实际搜索硬盘查询文件名称&#xff1b;whereis&#xff1a;查看文件的位置…

sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数

接连两篇函数专题深度解析&#xff0c;相信大家已经对函数的语法有了深入的了解。函数简单使用和基本知识解析匿名函数和闭包五一放假期间&#xff0c;我懂得&#xff0c;估计你们都不想学习。小熊这两天因为个人种种令人难受的原因&#xff0c;没有能更新&#xff0c;也没有提…

手工画设计模式的类图

画图成果 面试常考设计模式&#xff0c;往往需要动手画类图。之前面试的时候碰到画类图&#xff0c;往往直奔主题&#xff0c;立即开始画&#xff0c;往往画得很乱。其实面试是一个过程&#xff0c;看中的是思考分析解决问题的过程&#xff0c;结果反而不那么重要。画设计模式…

Reason: image not found

刚生的Xcode8&#xff0c;出现好多Error&#xff0c;有些Error真的太麻烦不想记录&#xff0c;现在这个挺简单的&#xff0c;就记下来&#xff0c;控制台输出的Error信息如下&#xff1a; fix&#xff1a; Target -> Build Phases ->Link Binary With Libraries&#xff…

go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...

利用splash爬取京东商品信息一、环境window7python3.5pycharmscrapyscrapy-splashMySQL二、简介为了体验scrapy-splash 的动态网页渲染效果&#xff0c;特地编写了利用splash爬取京东商品信息的爬虫&#xff0c;当然站在爬取效率和稳定性方面来说&#xff0c;动态网页爬取首先应…

jquery事件绑定解绑机制源码分析

引子 为什么Jquery能实现不传回调函数也能解绑事件&#xff1f;如下&#xff1a; $("p").on("click",function(){alert("The paragraph was clicked."); });$("#box1").off("click"); 事件绑定解绑机制 调用on函数的时候…

微信小程序导航:免费视频+精品教程+DEMO集合(长期更新)

1&#xff1a;官方工具&#xff1a;https://mp.weixin.qq.com/debug/w ... tml?t14764346784612&#xff1a;简易教程&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/dev/?t14764346775993&#xff1a;设计指南&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/desig…

怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法

转载的文章&#xff0c;原文&#xff1a;电脑弹出USB设备时提示该设备正在使用中的解决方法&#xff0d;系统城​www.xitongcheng.com电脑弹出USB设备时提示该设备正在使用&#xff0c;虽然在正常显示时并没有程序在使用&#xff0c;但是确实会出现这种情况&#xff0c;实际上确…

js菜单自适应的实现

功能示意图 菜单自适应示意图如下&#xff1a; 对象A可以拖动&#xff0c;缩放。菜单跟随对象A拖动&#xff0c;位置优先级为下面、上面、右边、左边、中间。 实现思路 其实菜单放在上下左右中&#xff0c;都是它的left和top在变&#xff0c;我们只要依次计算菜单在下/上/右…

python转换为c代码_bash 转换为C代码

bash 转换为C代码,并编译为可执行文件[rootlocalhost ~]# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz[rootlocalhost ~]# tar xvfz shc-3.8.9.tgz[rootlocalhost ~]# cd shc-3.8.9[rootlocalhost shc-3.8.9]# gcc -c shc.c[rootlocalhost shc-3.8.9]# gcc…