先上图:

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

  1. class 我{
  2. 吃饭(){}
  3. 逛街(){}
  4. 啪啪啪(){}
  5. 睡觉(){}
  6. }

但问题来了,啪啪啪是个技术活,有著名的48式,今天到底要用哪一式呢?于是我的代码变成了这样:

  1. class 我{
  2. 吃饭(){}
  3. 逛街(){}
  4. 啪啪啪1式(){}
  5. 啪啪啪2式(){}
  6. 啪啪啪3式(){}
  7. 睡觉(){}
  8. }

但代码如果是这样的,宝宝肯会被老板开掉的。但宝宝发现,啪啪啪的方式其实取决于我的妹子。对三种不同类型的妹子,我的表现是不同的。

  1. class 鬼妹 implements 妹子{
  2. 爱爱(){print(”Come on!“);}
  3. }
  4. class 乖妹 implements 妹子{
  5. 爱爱(){print("I love you!");}
  6. }
  7. class 萌妹 implements 妹子{
  8. 爱爱(){print("Ya Mie Die!");}
  9. }
  10. interface 妹子 {
  11. 爱爱();
  12. }

而且我惊讶地发现,所有妹子都把啪啪啪叫做”爱爱“。所以只要我只要知道今天晚上是和哪个妹子在一起,根据多态性,我只要说同一句话:”妹子让我们爱爱吧“。接下来发生的事,我只要闭上眼睛享受就好了。

  1. class 我{
  2. 吃饭();
  3. 逛街();
  4. 啪啪啪(妹子 今晚的妹子){
  5. 今晚的妹子.爱爱();
  6. }
  7. 睡觉();
  8. }

于是,你懂的:

  1. main(){
  2. 胖胖 = new 我();
  3. print("周一:");
  4. 妹子 娘子 = new 乖妹();
  5. 胖胖.啪啪啪(娘子);
  6. print("周二:");
  7. 妹子 小三 = new 萌妹();
  8. 胖胖.啪啪啪(小三);
  9. }

//OutPut:

周一:I love you!

周二:Ya Mie Die!

以上的就叫:策略模式!

但后来我发现,其实我做的每一件事都取决我的妹子,我彻底震惊了!我的生活不能没有妹子!

  1. class 我{
  2. 吃饭(妹子 今晚的妹子){
  3. 今晚的妹子.饭饭();
  4. }
  5. 逛街(妹子 今晚的妹子){
  6. 今晚的妹子.逛逛();
  7. }
  8. 啪啪啪(妹子 今晚的妹子){
  9. 今晚的妹子.爱爱();
  10. }
  11. 睡觉(妹子 今晚的妹子){
  12. 今晚的妹子.呼呼();
  13. }
  14. }

于是终于说出了那句话:嫁给我吧!于是,她彻底走进了我的生活!

  1. class 我{
  2. 吃饭(){
  3. 老婆.饭饭();
  4. }
  5. 逛街(){
  6. 老婆.逛逛();
  7. }
  8. 啪啪啪(){
  9. 老婆.爱爱();
  10. }
  11. 睡觉(){
  12. 老婆.呼呼();
  13. }
  14. //fields
  15. 妹子 老婆 = new 乖妹子();
  16. }

但你们是懂我的,我的小三怎么办呢?要是每天都能切换情人就最好了!

  1. class 我{
  2. 切换情人(妹子 情人){
  3. 老婆 = 情人;
  4. }
  5. 吃饭(){
  6. 老婆.饭饭();
  7. }
  8. 逛街(){
  9. 老婆.逛逛();
  10. }
  11. 啪啪啪(){
  12. 老婆.爱爱();
  13. }
  14. 睡觉(){
  15. 老婆.呼呼();
  16. }
  17. //fields
  18. 妹子 老婆 = new 乖妹子();
  19. }

于是每一天都充满了新鲜感呢!

  1. main(){
  2. 胖胖 = new 我();
  3. print("周一:");
  4. //老婆
  5. 胖胖.啪啪啪();
  6. print("周二:");
  7. 妹子 小三 = new 萌妹();
  8. 胖胖.切换情人(小三);
  9. //小三
  10. 胖胖.啪啪啪();
  11. }

//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. [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)

    今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...

  2. "用户增长"--快速身份认证实现用户增长的技术和产品方案

    "用户增长"--快速身份认证实现用户增长的技术和产品方案 1   引言 作为一个互联网产品,用户量的增长是一个非常重要的衡量指标. 这是一个集合了销售,市场,运营,技术的综合能力. ...

  3. 浅谈SOA

    概念 wiki对于SOA定义如下: A service-oriented architecture (SOA) is a design pattern in which application com ...

  4. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

  5. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  6. python常用模块

    os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os ...

  7. Dom addEventlistener与id 绑定事件的区别(续)

    addEventListener 第三个参数为 useCapture. 以一个例子说明. <div id="div1" style="background: blu ...

  8. Android之SQLite数据库使用

    转载整理于:http://my.csdn.net/lmj623565791 我刚开始接触Android的时候甚至都不敢相信,Android系统竟然是内置了数据库的!好吧,是我太孤陋寡闻了.由于我之前是 ...

  9. ASP.NET 访问共享文件夹

    配置代码: var dataProtection = new Microsoft.AspNet.DataProtection.DataProtectionProvider(new DirectoryI ...

  10. JavaScript 函数节流和函数去抖应用场景辨析

    概述 也是好久没更新 源码解读,看着房价蹭蹭暴涨,心里也是五味杂陈,对未来充满恐惧和迷茫 ...(敢问一句你们上岸了吗) 言归正传,今天要介绍的是 underscore 中两个重要的方法,函数节流和函 ...