当前位置: 首页 > news >正文

状态模式与外观模式的碰撞

一、举例体验

炎热的季节又来到了,收拾橱子整理衣服,发现冬天的大棉服还没有收拾,到底是手洗呢?还是送到洗衣店呢?真的是愁啊?愁?

送到洗衣店不用自己动手,只要交上Money就一切解决,是方便了,可是心疼那些钱啊,偷懒的同时心情也不是很好;不送到洗衣店,自己动手来解决,心情也不是很好,因为还得自己动手啊!面对那么厚的衣服,不洗都感觉很累啊!突然间想到自己在家悠闲的日子了,因为又不用花钱,也不用自己动手啊!心情当然高兴了!(一切老妈来搞定)。

这段小故事不就体现了两个设计模式吗?把衣服送到洗衣店,不用自己来面对那些棉服,洗衣液等等,很是方便。这就是设计模式中所谓的状态模式;花钱了,心情很不舒服;花开的日子到了,出门踏青让自己的心情得到了放松,某天因为一件小事而伤心了……心情的转变不就是一个状态模式吗?

二、结构图理解

来看看结构图,理解一下:

外观模式的结构图:


(Facade):外观类,知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象

(SubSystem):子系统类集合,实现子系统的功能,处理Facade对象指派的任务。注意子类中没有Facade的任何信息,即没有对Facade对象的引用。

状态模式的结构图:


(Context):维护一个ConcreteState子类的实例,这个实例定义当前的状态

(ConcreteState):具体状态,每一个子类实现一个与Context的一个状态相关的行为

首先从类图关系的角度分析:外观模式中,子系统类和外观类之间是关联关系;状态模式中,子类与抽象状态类之间是泛化关系,即所谓的继承关系,如上文举例当中,各种心情的变化,最终还是归属于状态。

三、模式区分:

外观模式是一种结构型模式;就上述例子而言,通过洗衣店把自己这个类和衣服这个类分离开来了,解决了类与类之间的依赖关系,外观模式通过把他们的关系放在一个Facade中,降低了类类之间的耦合度。重要作用就是起到了解耦的作用。

状态模式是一种行为型模式;将特定的状态相关的行为放入一个对象中,如上例,各种心情的状态都可以存放在ConcreteState中,即定义新的子类可以很容易地增加新的状态和转换

四、Code

外观模式保存了各个子系统对象,然后根据实际逻辑组合;状态模式是允许一个对象在其内部对象改变时改变它的行为,对象看起来似乎修改了它的类。

其实各种模式都得满足于面向对象设计的最终目的,满足于六大原则。

转载于:https://www.cnblogs.com/huohuoL/p/10545591.html

相关文章:

  • 【hdoj】1358 Period【字符串--最小循环节 i/next[i]即为其长度】
  • Cracking The Coding Interview 3.6
  • 爬虫原理与数据抓取----- urllib2:GET请求和POST请求
  • 算法导论读书笔记(2)
  • Java中的基本类型和包装类
  • 用jquery-easyui中的combotree实现树形结构的选择
  • Oracle推出轻量级Java微服务框架Helidon
  • Postgres和MySQL创建用户并授予db权限
  • 自定义JSP标签库及Properties使用
  • Kubernetes - 集群内容器访问集群外服务
  • 同步和异步的区别
  • 认真的做羞羞的事 一颗种子的自我分享
  • Java异常机制
  • 使用Docker1.13.1快速部署ELK环境
  • SliTaz 从入门到精通
  • 08.Android之View事件问题
  • 230. Kth Smallest Element in a BST
  • Angular Elements 及其运作原理
  • C++类的相互关联
  • chrome扩展demo1-小时钟
  • JAVA SE 6 GC调优笔记
  • PHP那些事儿
  • session共享问题解决方案
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 从零开始的无人驾驶 1
  • 当SetTimeout遇到了字符串
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 理清楚Vue的结构
  • 力扣(LeetCode)21
  • 通过几道题目学习二叉搜索树
  • 再次简单明了总结flex布局,一看就懂...
  • ###C语言程序设计-----C语言学习(3)#
  • #前后端分离# 头条发布系统
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (LeetCode C++)盛最多水的容器
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)大型网站的系统架构
  • (转)重识new
  • .NET基础篇——反射的奥妙
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @Autowired多个相同类型bean装配问题
  • @Autowired注解的实现原理
  • @JsonFormat与@DateTimeFormat注解的使用
  • @拔赤:Web前端开发十日谈
  • [ NOI 2001 ] 食物链
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [C++核心编程](四):类和对象——封装
  • [corCTF 2022] CoRJail: From Null Byte Overflow To Docker Escape