Java基础、中级、高级、架构面试资料

从程序员找女朋友来讲状态模式和策略模式的区别

JAVA herman 3427浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

最近,我看到了一篇非常优秀的文章在讲解状态模式和策略模式的区别以及联系,用的例子非常的好,也非常的搞笑,所以就想转过来,分享给大家!

再开始之前,我们先看一下策略模式的类图。

策略模式类图

关于状态模式,可以先回顾一下我的这篇文章《从电商系统订单状态说状态模式!》。

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

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!

于是,我都爱上了这种叫”状态模式“的生活方式。

所以,”策略模式“就好比单身的时候,没有固定情人,每天用微信出去约泡。”状态模式“就是结婚以后,有了固定的情人,生活可以在老婆和小三之间游刃有余!

说到这里,大家一定都豁然开朗了吧!那么,祝大家生活幸福!

以上内容转载自:https://www.zhihu.com/question/23693088/answer/108746200

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 从程序员找女朋友来讲状态模式和策略模式的区别