2020-05-17 观察者模式和装饰模式

观察者模式

初识观察者模式:报社+订阅者 = 观察者模式。

我们来看一下报社的订阅是怎么回事:

报社的业务是出版报纸;

路人A向报社订阅报纸,只要报社没倒闭就会每天给你送当日的报纸。只要路人A是报社的订户,就会一直收到当日的报纸;

路人A厌倦了看报纸就取消订阅,报社就不会再向路人A送报纸了;

只要报社没有倒闭,就有人向他们订阅报纸或取消订阅报纸;

观察者模式中的主题(Subject)对象就是刚刚提到的报社,路人A则是观察者模式中的观察者(Observer)对象。

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

这就是松耦合的威力

当两个对象之间松耦合,他们依然可以交互,但是不清楚彼此的细节。观察者模式提供了这样一种对象设计,让主题和观察者之间松耦合。

主题不需要知道观察者的具体类是谁,做了什么或者其他任何细节。对于主题来说,只知道观察者实现了Observer接口即可,主题只依赖于观察者对象的列表。可以在任何时候增加或删除观察者,而主题不会受到任何影响。这意味着我们不需要为了兼容新的类而修改主题中的代码,唯一要做的就是在新增加的类里去实现Observer接口,然后注册成观察者即可。

装饰模式

定义:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,在不改变原来代码的情况下,扩展功能。

设计原则:开闭原则,对扩展开放,对修改关闭。

举个栗子:

星巴克有很多种咖啡,有很多种调料,目的是为了计算最终的价格cost方法和此种咖啡的描述getDesp方法(咖啡名+调料1+调料2),这里引申出来的问题是如何动态的添加调料,在不修改原来代码的情况下计算。

分析:

可是为什么还要用这个装饰者模式来解决?我认为学习设计模式,看懂这个模式的代码简单,关键是要理解他为什么这么干,当他提出问题的场景时,我们先自己考虑一种做法,再与真正的模式作比较,思考模式带来的好处。那么上面提出的想当然做法,其实也挺好啊,与模式比较,谁对说错呢?其实首先我们进入了一个误区,用设计模式 不该考虑持久化的事情。从持久化来看,我们调料是一个类,有若干条数据,如果不用持久化,则我们每一个调料都是一个类,然后咖啡持有一个list调料的集合,往里面add,遍历这个list即可了,与持久化相比不过是每条数据算一个类罢了,这样可不可以呢?其实在咖啡计算这个场景下是可以的,但是这里我们只是简单的计算功能,这里调料类不过起到了存储数据的作用,如果功能更复杂了呢?需要多行代码处理一些其他的事情?回到上面的问题,如何在不修改原来代码,动态扩展功能(添加调料,计算价格),此为开闭原则。

术语:组件(相当于咖啡),装饰者(相当于调料)

总结:

装饰者要扩展原来组件的功能,装饰者要持有组件对象,装饰者有一个方法对应扩展组件中的一个方法。怎么理解:要扩展原来对象的功能,首先得有原来对象,所以一个成员变量持有原来对象,我再有个扩展方法 扩展 组件中需要扩展的方法,前提是这个需要扩展的方法,是有返回值的,他不可能是void啊,因为我需要对他TA个值再进行二次的处理啊,这才叫扩展啊。这个道理很容易理解,其实这里扮演装饰者的角色,你当然可以在任何一个类,方法中都可以做到,但那怎么还称之为模式啊,这里装饰者类是只做这个事情,只与原来组件相关,他是不耦合任何其他操作的。模式是有固定的抽象层面的套路,这里的套路是组件有个父类,组件中需要变化的方法在父类中,由子类重写,而装饰者是为了扩展这些变化的方法,所以装饰者直接或间接也继承组件父类,并持有组件父类引用。

值得注意的是,java中io是用了装饰者模式,所以有的io类构造方法是传入另一个io类。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354