先上图:

本质上讲,策略模式和状态模式做得是同一件事:去耦合。怎么去耦合?就是把干什么(语境类)和怎么干(策略接口)分开,互不依赖。打个比方,下面是我一天的行程:

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 策略模式和状态模式的更多相关文章

  1. Java设计模式之策略模式与状态模式

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. ...

  2. java - 策略模式、状态模式、卫语句,避免多重if-else(转)

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  3. Java重构-策略模式、状态模式、卫语句

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  4. 【转】Java重构-策略模式、状态模式、卫语句

    前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...

  5. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  6. 《大话》之 策略模式 Vs 状态模式

    一.简介: 策略模式: 背景:商店要打折销售,各种版本的销售方式,让小菜心烦意乱 内容:    定义算法家族,分别封装起来,让他们之间可以户型替换,此模式让算法的变化,不会影响到使用算法的用户. 图文 ...

  7. Java设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  8. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  9. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

随机推荐

  1. atitit 商业项目常用模块技术知识点 v3 qc29

    atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...

  2. es6学习笔记

    class Point { constructor(x, y) { this.x = x; this.y = y; } static classMethod() { console.log('fath ...

  3. 如何调用Google地图?

    在建设网站中用到地图是很常见的,在国内大部分都是用百度地图,但是有时候可能会用到国外地址,这时候就只能使用谷歌地图了. 方法一.使用框架引入谷歌地图 用框架引入谷歌地址是最简单的方法,不是专业开发人员 ...

  4. Redis系列之key操作命令与Redis中的事务详解(六)

    序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...

  5. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  6. 填坑系列:通过ESXi来配置IPMI

    近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...

  7. 【分布式】Zookeeper应用场景

    一.前言 在上一篇博客已经介绍了Zookeeper开源客户端的简单实用,本篇讲解Zookeeper的应用场景. 二.典型应用场景 Zookeeper是一个高可用的分布式数据管理和协调框架,并且能够很好 ...

  8. u-boot源码分析之C语言段

    题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...

  9. TCP四种计时器

    TCP共使用以下四种计时器,即重传计时器.坚持计时器.保活计时器和时间等待计时器 .这几个计时器的主要特点如下:      1.重传计时器      当TCP发送报文段时,就创建该特定报文段的重传计时 ...

  10. JS性能优化

    1.不要在同一行声明多个变量. 2.请使用 ===/!==来比较true/false或者数值 3.使用对象字面量替代new Array这种形式 4.不要使用全局函数. 5.Switch语句必须带有de ...