Java 策略模式和状态模式
先上图:
本质上讲,策略模式和状态模式做得是同一件事:去耦合。怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开,互不依赖。打个比方,下面是我一天的行程:
class 我{
吃饭(){}
逛街(){}
啪啪啪(){}
睡觉(){}
}
但问题来了,啪啪啪是个技术活,有著名的48式,今天到底要用哪一式呢?于是我的代码变成了这样:
class 我{
吃饭(){}
逛街(){}
啪啪啪1式(){}
啪啪啪2式(){}
啪啪啪3式(){}
睡觉(){}
}
但代码如果是这样的,宝宝肯会被老板开掉的。但宝宝发现,啪啪啪的方式其实取决于我的妹子。对三种不同类型的妹子,我的表现是不同的。
class 鬼妹 implements 妹子{
爱爱(){print(”Come on!“);}
}
class 乖妹 implements 妹子{
爱爱(){print("I love you!");}
}
class 萌妹 implements 妹子{
爱爱(){print("Ya Mie Die!");}
}
interface 妹子 {
爱爱();
}
而且我惊讶地发现,所有妹子都把啪啪啪叫做”爱爱“。所以只要我只要知道今天晚上是和哪个妹子在一起,根据多态性,我只要说同一句话:”妹子让我们爱爱吧“。接下来发生的事,我只要闭上眼睛享受就好了。
class 我{
吃饭();
逛街();
啪啪啪(妹子 今晚的妹子){
今晚的妹子.爱爱();
}
睡觉();
}
于是,你懂的:
main(){
我 胖胖 = new 我();
print("周一:");
妹子 娘子 = new 乖妹();
胖胖.啪啪啪(娘子);
print("周二:");
妹子 小三 = new 萌妹();
胖胖.啪啪啪(小三);
}
//OutPut:
周一:I love you!
周二:Ya Mie Die!
以上的就叫:策略模式!
但后来我发现,其实我做的每一件事都取决我的妹子,我彻底震惊了!我的生活不能没有妹子!
class 我{
吃饭(妹子 今晚的妹子){
今晚的妹子.饭饭();
}
逛街(妹子 今晚的妹子){
今晚的妹子.逛逛();
}
啪啪啪(妹子 今晚的妹子){
今晚的妹子.爱爱();
}
睡觉(妹子 今晚的妹子){
今晚的妹子.呼呼();
}
}
于是终于说出了那句话:嫁给我吧!于是,她彻底走进了我的生活!
class 我{
吃饭(){
老婆.饭饭();
}
逛街(){
老婆.逛逛();
}
啪啪啪(){
老婆.爱爱();
}
睡觉(){
老婆.呼呼();
}
//fields
妹子 老婆 = new 乖妹子();
}
但你们是懂我的,我的小三怎么办呢?要是每天都能切换情人就最好了!
class 我{
切换情人(妹子 情人){
老婆 = 情人;
}
吃饭(){
老婆.饭饭();
}
逛街(){
老婆.逛逛();
}
啪啪啪(){
老婆.爱爱();
}
睡觉(){
老婆.呼呼();
}
//fields
妹子 老婆 = new 乖妹子();
}
于是每一天都充满了新鲜感呢!
main(){
我 胖胖 = new 我();
print("周一:");
//老婆
胖胖.啪啪啪();
print("周二:");
妹子 小三 = new 萌妹();
胖胖.切换情人(小三);
//小三
胖胖.啪啪啪();
}
//OutPut:
周一:I love you!
周二:Ya Mie Die!
于是,我都爱上了这种叫”状态模式“的生活方式。
所以,”策略模式“就好比单身的时候,没有固定情人,每天用微信出去约泡。”状态模式“就是结婚以后,有了固定的情人,生活可以在老婆和小三之间游刃有余!
说到这里,大家一定都豁然开朗了吧!那么,祝大家生活幸福!
Java 策略模式和状态模式的更多相关文章
- Java设计模式之策略模式与状态模式
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. ...
- java - 策略模式、状态模式、卫语句,避免多重if-else(转)
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
- Java重构-策略模式、状态模式、卫语句
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
- 【转】Java重构-策略模式、状态模式、卫语句
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- 《大话》之 策略模式 Vs 状态模式
一.简介: 策略模式: 背景:商店要打折销售,各种版本的销售方式,让小菜心烦意乱 内容: 定义算法家族,分别封装起来,让他们之间可以户型替换,此模式让算法的变化,不会影响到使用算法的用户. 图文 ...
- Java设计模式之十二 ---- 备忘录模式和状态模式
前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...
- 【设计模式】 模式PK:策略模式VS状态模式
1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...
- 设计模式之策略模式和状态模式(strategy pattern & state pattern)
本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...
随机推荐
- Jexus 服务器部署导航
说明:本索引只是方便本人查找,不涉及版权问题,所有博客,还是到元博客地址访问. <script async src="//pagead2.googlesyndication.com/p ...
- MongoDB Java Driver操作指南
MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...
- Spark 运行架构核心总结
摘要: 1.基本术语 2.运行架构 2.1基本架构 2.2运行流程 2.3相关的UML类图 2.4调度模块: 2.4.1作业调度简介 2.4.2任务调度简介 3.运行模式 3.1 standalo ...
- My97DatePicker时间控件在项目中的应用
一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...
- ContentProvider域名替换小工具
开发项目域名想怎么换就怎么换,就是这么任性! 这是一个很有意思的小工具! 这是一个方便开发人员和测试人员的小工具!! 吐槽: 一直在做Android开发,一直总有一个问题存在:做自己公司的apk开发时 ...
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- C++服务器开发之基于对象的编程风格
Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include <pthread.h> #include <boost/functio ...
- JS组件系列——Bootstrap文件上传组件:bootstrap fileinput
前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...
- 【NLP】揭秘马尔可夫模型神秘面纱系列文章(四)
维特比算法解决隐马尔可夫模型解码问题(中文句法标注) 作者:白宁超 2016年7月12日14:08:28 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无 ...
- ADO.NET存取数据库数据
步骤: //数据库连接串 string conStr = "......" //创建连接对象 SqlConnection connection = new SqlConnectio ...