几个设计模式的要点

设计模式嘛,资料太多了,其实只要明白个大致就好,实际运用有很多改进,或者多种模式混合的情况。如果能掌握其精髓,明白为了解决什么问题,而采用了什么方法,这才算真正学会了设计模式,才能灵活运用。但是大部分情况得在实际项目中才能体会得到呀,所以这里也就简单的列下个人理解,对于编码时的结构设计,到现在还是挺让我纠结的。(我又不是处女座,为毛啊!)(吐槽下,这段太啰嗦了)

六大原则

  1. 开闭原则
  2. 里氏替换原则
  3. 依赖倒置原则
  4. 接口隔离原则
  5. 迪米特法则,又称最少知道原则
  6. 合成复用原则

观察者模式(Observer Pattern)

  • 常说的事件机制。
  • 好处在于可以实现一对多的关系。发送者只管发送,如果要新增观察者,不需要修改已有代码,让新观察者自己注册到发送者去即可。
  • 主要成员:主题(Subject,或者说发送者),观察者(Observer)
  • 发送者成员:添加观察者的方法(Add),移除观察者的方法(Remove),存储观察者的数据结构(Dictionary/List),触发事件的接口(Fire)。
  • 观察者成员:供发送者调用的接口(或者说对通知作出响应的接口)
  • 比如游戏中金币发生改变,然后UI界面中的TopBar界面的金币数量需要刷新,道具界面的金币数量也需要刷新。假设没有观察者模式,那么我们需要先获取所有需要刷新的界面,判断界面不为空,然后调用刷新接口。而有了观察者模式,只需要各个需要刷新的界面,自己注册事件监听,界面移除,自己移除监听。简单的说就是解耦合啦,各管各的。
  • 观察者成员在C#中不一定要是个类,可以是个Action什么的,反正本质也就是提供一个可以让发送者调用的方法。

状态模式(State Pattern)

  • 常说的状态机。
  • 主要成员:状态类(State),状态管理类(State Machine)。
  • 状态类:一些和该状态要做的事情有关的方法咯。可能有OnEnter,OnUpdate,OnExit分别表示进入该状态要做什么,状态中要做什么,离开状态要做什么。也可能就一个DoState。
  • 状态管理类:当前状态类的引用,改变状态的接口。
  • 状态模式也是为了 对扩展开放,对修改关闭。减少复杂的if-else判断分支。
  • 比如某个游戏界面中有开启,关闭,等待匹配,挂机,战斗中等状态,在不同状态时,某个界面块有不同的表现,这时候会有一个UpdateSth的方法。假设没有状态模式,那么就需要在UpdateSth通过if-else来判断当前状态应该做什么,一旦有新的状态加入,又需要修改这个方法。 但是有了状态模式,所有状态都会实现一个UpdateSth方法,而界面通过改变状态,让状态类自行调用自己的UpdateSth。这样就算有新状态加入,也不需要修改已有的UpdateSth代码,只需要添加新的状态类即可。 从而保证了代码的稳定性,不动到旧代码。

对象池模式(Object Pool)

  • 常说的回收池/对象池。
  • 主要成员:对象池的管理者(ObjectPool)(单例模式)
  • 对象池的管理者:存储对象的数据结构ObjectPool(Stack/Queue/List),获取对象的方法(AcquireObject),返还对象的方法(ReleaseObject)。
  • 对象池模式算是单例模式和享元模式的混合吧,当然还是和享元模式有点本质的不同的。
  • 主要是对象的复用,可能还需要对复用对象的数据进行重置,然后提供给调用者使用。
  • 游戏中的子弹回收。

迭代器模式(Iterator Pattern)

  • C#中的IEnumrabale和IEnumrator。
  • 主要成员:迭代器(iterator),迭代器获取器(Container)
  • 迭代器:获取下一个对象的方法(Next), 是否有下一个对象(HasNext) (变体很多,本质就是为了获取下一个对象)
  • 迭代器获取器:获取迭代器的方法(GetIterator)
  • 迭代器平时还没咋用到,主要是C#中的foreach,StartCoroutine借助了迭代器模式。

参考

菜鸟教程-设计模式

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,894评论 1 15
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,387评论 25 707
  • 在西方发达国家,一直比较重视职业生涯的设计,许多国家的学校教育中就有职业设计辅导这一课程。在美国,孩子们上八年级(...
    琪00峰阅读 587评论 3 8
  • 这篇主要整理下Python中的内置函数说明和实际用法,希望对新手有帮助。「其中一部分,有时间会继续整理」 1.ab...
    Bug生活2048阅读 285评论 0 1