《大话设计模式》读书笔记

1. 简单工厂模式(计算器)

定义: 在这模式中工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生产具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

心得: 把类似的事件集合起来,抽取出通用的方法。然后采用工厂方法实例化子类。

创建一个所有事件的抽象方法A。创建一个工厂类,将所有可能的事件分类,每一种创建一个子类返回A。那么可操作A的实例了。

例子精髓: (用flutter编写了Calculator例子)

(1)实现计算器时,将界面和算法分离。可以做到界面修改时,不涉及到算法。

(2)添加新算法不影响旧代码。

2. 策略模式 (收银台)

定义: 定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

心得: 将所有的事件分类,为每一个类型创建一个类实现A。用工厂方法,将所有的事件处理都放到Context中,并实例化A。这样就可以:新增加类别时,仅仅涉及Context和新类的修改。

例子精髓: (用flutter编写了CashierSystem例子)

(1)将算法独立,并抽象不同的计算方式。

3. 单一职责原则(方块游戏)

定义: 就一个类而言,应该仅仅有一个引起它变化的原因。

心得: 将界面和逻辑的代码分开。实现在修改界面的时候,不需要进行逻辑代码的修改。

4. 开放-封闭原则(考研)

定义: 软件实体(类、模块、函数等)应该可以扩展,但是不可修改。

心得: 增加新功能的时候,尽量不要去修改无关的代码。

对程序中呈现出频繁变化的那些部分做出抽象。不需要刻意地进行抽象。

5. 依赖倒转原则(电脑组装)

定义: (1)高层模块不应该依赖低层模块。两个都应该依赖抽象。

(2)抽象不应该依赖细节,细节应该依赖于抽象。(针对接口编程)

里氏代换原则:子类型必须能够替换掉它们的父类型。 (企鹅不能继承鸟类,因为不能飞)

心得: 定义一个接口S,高层模块A依赖接口,低层模块B实现接口。即在A创建一个B的实例C,C可以进行调用所有接口的方法。

6. 装饰模式 (穿衣搭配)

定义: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

心得: 创建一个装饰类,接受一个接口的实例A又实现接口B并调用A的实现方法。

例子精髓: (用flutter编写了person例子)

(1)相当于链式调用,生成一个服饰实例后直接链接到原来实例上,实现穿衣。

7. 代理模式(为别人做嫁衣)

定义: 为其他对象提供一种代理以控制对这个对象的访问。

使用场景有:(1)远程代理。(2)虚拟代理。(3)安全代理。(4)智能指引。

心得: 就是做了一层包装A。在项目中对网络请求做了一层保存,这样在更换网络框架时,仅仅涉及A的修改。

例子精髓: (用flutter编写了Proxy例子)

(1)Pursuit请别人Proxy帮忙去送花追求SchoolGirl。此时SchoolGirl不认识Pursuit,由Proxy来代理Pursuit。

(2)使用第三方库时,做一个封装。比较项目直接依赖第三方库。当需要更换第三方库时,可以不修改项目代码。

8. 工厂方法模式(雷锋依然在人间)

定义: 用于创建对象的接口,让子类决定实例化哪一个类。

工厂方法使一个类的实例化延迟到其子类。

心得: 与简单工厂模式的区别是,将实例化从工厂方法中,移到了客户端中。

每次新增加运算需求时,则需要新建一个运算类和客户端实例化运算类。

例子精髓: (用flutter编写了lei_feng例子)

9. 原型模式(简历复印)

定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

心得: 实现一个clone的方法。采用深复制的模式,创建一个带所有内容的新对象,修改几个属性,成为一个类似的对象。

例子精髓: (用flutter编写了Resume例子)

(1)类似于实现一个copyWith的方法。

(2)定义一个模式,然后深拷贝此模式,并修改一些属性。

10. 模板方法模式(考题抄错会做也白搭)

定义: 一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

心得: 把不变行为搬移到超类,去除子类中的重复代码。

例子精髓: (用flutter编写了questions例子)

(1)定义好questions这个模版。然后实例实现虚方法。

(2)PagingListWidget采用此方式。将通用的内容放到父类,然后用子类来做区别。

11. 迪米特法则(无熟人难办事?)

定义: 如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

心得: 降低类与类之间的耦合性。

12. 外观模式(牛市股票还会亏钱?)

定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口是的这一子系统更加容易使用。

心得: 创建一个类提供一些功能,而具体的功能实现是由其他类实现的。

例子精髓: (用flutter编写了facade例子)

(1)封装一层,隐藏底层的复杂逻辑。

13. 建造者模式(好菜每回味不同)

定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

心得: 模板方法模式的升级版,多了一个创建者规范操作。

例子精髓: (用flutter编写了builder例子)

(1)创建者规范所有的操作。避免出现细节丢失的问题。

(2)新增加类型的时候,只要继承PersonBuilder并实现所有方法即可。

14. 观察者模式(老板回来,我不知道)

定义: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

心得: RiverPod状态机就是一个观察者模式。

例子精髓: (用flutter编写了observer例子)

  1. Boss添加所有同事,统一通知。耦合较多。
  2. iOS的监听,是用一个单例来实现通知,在class中添加监听。那么当有广播事件时,则执行监听的方法。

15. 抽象工厂模式(就不能不换DB吗?)

定义: 提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类。

心得: 创建一个工厂方法,提供统一的方法来适配不同平台或环境。与"工厂方法"或"外观模式"比较类似。

例子精髓: (用flutter编写了factory例子)

  1. 创建一个工厂方法,提供所有的表和操作方法。每一张表兼容不同的平台。
  2. 新增表,需要修改(1)新增表的类。(2)修改工厂方法。

16. 状态模式(无尽加班何时休)

定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

心得: 把情况分成不同的状态,然后用状态来管理。

例子精髓: (用flutter编写了state例子)

  1. 将状态抽象成一个接口,然后不同的状态实现不同的类。
  2. 传入值后就可以返回指定的状态。

17. 适配器模式(在NBA我需要翻译)

定义: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

心得: 觉得和代理模式很类似。设置一个适配器层,去访问原来不能访问的。

在设计开发后期或维护期使用。

例子精髓: (用flutter编写了adpter例子)

  1. 使用Translator来创建一个翻译者运动员,依赖外籍中锋并执行指令的传递。

18. 备忘录模式(如果再回到从前)

定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象回复到原先保存的状态。

心得: 当页面进行内容修改时可以使用,先保存之前的内容。当提交失败时,可以恢复到之前的数据。

例子精髓: (用flutter编写了memento例子)

  1. 发起者会创建备忘录,管理者会保存了一份备忘录。发起者可从管理者获取到备忘录,恢复到之前的状态。
  2. 备忘录仅仅是保存一些需要备份的数据,而不是发起者的所有的属性。

19. 组合模式(分公司=-部门)

定义: 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

心得: 部分和整体的关系。对每一个对象在使用的时候,操作都是一样的。

例子精髓: (用flutter编写了composite例子)

  1. 抽象公司及职责。所有公司和部门都集成抽象类,统一类型。
  2. 可以将整个公司都组合在一起。可以查找到某一级,进行业务操作。

20. 迭代器模式(想走?可以!先买票)

定义: 提供一种方法顺序访问一个聚合对象中个元素,而又不暴露该对象的内部表示。

心得: for循环,语言中自带此模式。

21. 单例模式(有些类也需计划生育)

定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

心得: 全局唯一的一个对象。常用于文件读写,网络请求等。

22. 桥接模式(手机软件合适统一)

定义: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。

尽量使用合成/聚合,尽量不要使用类继承。

合成: 翅磅和大雁的关系。聚合: 一只大雁和一个雁群的关系。

心得: 继承是一种强耦合的结构。父类变,子类就必须要变。

例子精髓: (用flutter编写了bridge例子)

  1. 将手机和软件分开,然后软件是手机的一个聚合。
  2. 此时新增加手机或软件,不会修改到之前的代码。

23. 命令模式(烤羊肉串引来的思考)

定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

心得: 进行点菜的操作,涉及到下单,执行,撤销的操作。那么拆分成执行者,命令,接受者。

例子精髓: (用flutter编写了command例子)

  1. 抽象每一个角色。每一个角色添加事件处理逻辑。
  2. 编写代码按需编写,不用编写当前用不到的功能。

24. 职责链模式(加薪非要老总批)

定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之前的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

心得: 看起来和"状态模式"有一些相似,根据不同的状态处理不同的事,处理不了就调用下一级。

例子精髓: (用flutter编写了Manager例子)

  1. 一级一级的调用。如果要插入或修改一级,改动的代码较小。

25. 中介者模式(世界需要和平)

定义: 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

心得: 中介者拥有所有的对象,所有的逻辑都在中介者中。

例子精髓: (用flutter编写了Mediator例子)

  1. 中介者包含了所有对象,对不同对象进行执行不同的逻辑。

26. 享元模式(项目多也别傻做)

定义: 运用共享技术有效地支持大量细粒度的对象。

心得: 看起来和单例有些类似,提供一个实例。如定义了一个字符串A,"美好的世界"。那么再次定义字符串B"美好的世界"时,会直接指向A。减少空间占用。

例子精髓:

27. 解释器模式(其实你不懂老板的心)

定义: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

心得: 音乐解释器实例化不同的解释器,对不同内容进行相对应的解释,得到结果。

可以理解为将一个"类"翻译为另一个"类"。

例子精髓: (用flutter编写了Interpreter例子)

  1. 定义不同的解释器,将内容传入解释器进行翻译。
  2. 得到解释后的结果。

28. 访问者模式(男人和女人)

定义: 表示一个作用于某对象结构中的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式适用于数据结构相对稳定的系统。

心得: 访问者需要时固定不变的,不然会涉及到所有代码的修改。

例子精髓: (用flutter编写了Visitor例子)

  1. 一定要编写下代码才能理解这个模式,不然不明白模式表示的是什么意思。
  2. Elemet是固定的,即男和女。每一个Visitor中访问每一个Element。
  3. 如果Element变动,那么每一个Visitor都需要修改。
  4. 新增Visitor较容易。

尾声

面向对象的四个好处:可维护,可扩展,可复用和灵活性好。

花费几个月时间终于是学完了一遍,并且将demo也敲了一遍,同时将感悟的也应用到了项目中。很多年前就看过设计模式,但是没有此书说的那么透彻。可惜的是本人悟性太差,看完全书,之前的又忘记的差不多了。要多用用才行啊,以后再来刷一遍。

相关推荐
你听得到112 小时前
《Flutter性能优化全攻略:从首屏渲染到性能监测,附案例代码详解》
android·flutter
aakzhangliangming4 小时前
乐乐音乐Flutter版
flutter·音乐播放器·桌面开发·动感歌词·乐乐音乐·动感歌词转换器
江上清风山间明月13 小时前
Flutter DragTarget拖拽控件详解
android·flutter·ios·拖拽·dragtarget
江上清风山间明月1 天前
flutter bottomSheet 控件详解
android·flutter·底部导航·bottomsheet
yuanlaile2 天前
纯Dart Flutter库适配HarmonyOS
flutter·华为·harmonyos·flutter开发鸿蒙·harmonyos教程
yuanlaile2 天前
Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
flutter·华为·harmonyos·flutter开发鸿蒙
zacksleo2 天前
鸿蒙原生开发手记:04-一个完整元服务案例
flutter
jcLee953 天前
Flutter/Dart:使用日志模块Logger Easier
flutter·log4j·dart·logger
tmacfrank3 天前
Flutter 异步编程简述
flutter
tmacfrank3 天前
Flutter 基础知识总结
flutter