设计模式大纲
2019-08-01 00:19:56 68 举报
AI智能生成
后端:设计模式思维导图
作者其他创作
大纲/内容
适配器模式(Adapter)
案例: 使用火鸡来模拟鸭子
定义: 将一个类的接口,<font color="#c41230">转换</font>成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间
外观模式(Facade)
案例: 建立自己的家庭影院~
定义: 提供了一个统一的接口,用于访问子系统中的一群接口. 外观定义了一个高层接口,让子系统更容易使用
模板模式(Template Method)
案例: 创建咖啡和茶
定义: 在一个方法中<font color="#c41230">(父类)定义一个算法的骨架</font>, 而<font color="#c41230">将一些步骤延迟到子类中</font>. 模板方法使得<font color="#c41230">子类<br>可以在不改变算法结构的情况下, 重新定义算法中的某些步骤</font>
迭代器模式(Iterator)
案例: 对象村餐厅(数组存储菜单) 和 对象村煎饼屋(ArrayList存储菜单)合并了.<br>合并后如何打印出 当前菜单呢? printMenu()
定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示<br>(即<font color="#c41230">封装遍历</font>, 将遍历元素的动作抽取出来, 将<font color="#c41230">女招待解耦了</font>.女招待无需知道菜单列表是如何被实现的)
组合模式(composite)
案例: 希望加上一份 餐后甜点的 "子菜单"
允许你将对象组成<font color="#c41230">树形结构</font>来表现"<font color="#c41230">整体 / 部分</font>"的层次结构.<br><font color="#c41230">组合能让客户以一致的方式处理个别对象和对象组合</font>
状态模式(State)
案例: 设计糖果机!(状态: 糖果售罄,没有25分钱,有25分钱, 售出糖果)<br>动作: 投入25分钱, 退回25分钱, 转动曲柄
定义: 允许对象<font color="#c41230">在内部状态在改变时改变它的行为</font>,对象看起来好像改变了它的类<br>(将状态与该状态下的行为封装成独立的类,并将动作委托到代表当前状态的对象)
代理模式(Proxy)
案例: 远程监视糖果机的状态(剩余库存数量)
为另一个对象提供一个替身或占位符以访问这个对象
应用场景
远程代理 虚拟代理 动态代理等
模式中的模式--复合模式
复合模式的定义: 是指一群模式被结合起来使用,以解决一般性问题
案例1: 一群模式的协作-- 鸭子模拟器
案例2: MVC模式
剩下的模式
桥接模式(Bridge)
使用桥接模式,<font color="#c41230">不只改变你的实现,也改变你的抽象</font>
生成器模式(Builder)
封装一个产品的构造过程,并允许按步骤构造
责任链模式(Chain of Responsibility)
当你想要让<font color="#c41230">一个以上的对象</font>有机会能够<font color="#c41230">处理某个请求</font>的时候,就使用责任链模式
蝇量模式(Flyweight)
让某个类的一个实例能够提供许多"虚拟实例"
解释器模式(Interpreter)
为语言创建解释器
中介者模式(Mediator)
使用中介者模式来集中相关对象之间复杂的沟通与控制方式
备忘录模式(Memento)
当你需要让对象返回之前的状态时,就使用备忘录模式
原型模式(Prototype)
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式
访问者模式(Visitor)
当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式
OO原则
封装变化
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
多用组合,少用继承
鸭子的行为不是继承而来的,而是和适当的行为对象"<font color="#c41230">组合</font>"来的
不仅可将算法族封装成类,更可以"<font color="#c41230">在运行时动态地改变行为</font>"
针对接口编程,而不是针对实现编程
鸭子的行为将放在分开的类中,此类专门提供某行为接口的实现
为交互对象之间的松耦合设计而努力
改变主题或观察者其中一方,并不会影响另一方,因为两者是松耦合的<br>当两个对象之间松耦合,它们依然可以交互,但是不太清除彼此的细节
类应该对扩展开放,对修改关闭
依赖抽象,不需依赖具体类
减少对于具体类的依赖 . 以免具体类修改/删除时,当前代码要跟着改变
最少知识原则: 只和你的密友谈话
不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分
好莱坞原则:别调用(打电话)我们,我们会调用(打电话)你
允许底层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些底层组件
类应该只有一个改变的理由
设计模式的划分
根据模式的目标划分成3个类目
创建型
创建型模式<font color="#c41230">涉及到将对象实例化</font>, 这类模式都提供一个方法, 将客户从所需要实例化的对象中解耦
单例模式
构建者模式
原型模式
抽象工厂模式
工厂方法模式
行为型
只要是行为型模式,都涉及到 类和对象如何<font color="#c41230">交互和分配职责</font>
模板方法模式
迭代器模式
命令模式
观察者模式
状态模式
策略模式
结构型
结构性模式可以让你<font color="#c41230">把类或对象组合到更大的结构中</font>
装饰者模式
代理模式
组合模式
外观模式
适配器模式
策略模式(Strategy)
案例:鸭子模拟器,实现具有各种行为组合的鸭子
定义:策略模式<font color="#c41230">定义了算法族,分别封装起来</font>,让它们之间可以相互替换,<br>此模式让算法的变化部分 (鸭子行为) 独立于算法的客户(鸭子)
观察者模式 (Visitor)
案例:设计气象站 和广告板. 让气象站数据变化时通知所有广告板.并且广告板可动态扩展
定义: 在对象之间<font color="#c41230">定义一对多的依赖</font>,这样一来, 当一个对象改变状态,依赖它的对象都会收到通知,并自动更新
装饰者模式 (Decorator)
案例: 设计星巴兹咖啡, 主体(DarkRoast等) + 配料 (摩卡,奶泡等)
定义: <font color="#c41230">动态地将责任附加到对象上</font>.想要扩展功能,装饰者提供有别于继承的另一种选择(组合)
工厂模式
案例: 披萨店创建披萨订单 (品种)芝士披萨,蛤蜊披萨,素食披萨 -->(分店)美国风味,芝加哥风味
种类
简单工厂(Simple Factory)
定义一个创建对象的接口 (new) , 扩展性差(开分店了怎么办)
工厂方法模式(Facotory Method)
定义了一个创建对象的接口, 但<font color="#c41230">由子类决定要实例化的类是哪一个</font>.工厂方法<font color="#c41230">让类把实例化推迟到子类</font>
抽象工厂模式(Abstract Factory)
提供一个接口,用于创建相关 或依赖对象的<font color="#c41230">家族</font>,而不需要明确指定具体类
单例模式(Singleton)
案例: 创建唯一的 巧克力锅炉控制器
定义: 确保一个类只有一个实例,并提供全局访问点
命令模式 (Command)
案例: 智能遥控器, 一个插槽(某设备具体供应商)对应两个按钮 on , off ,以及一个全局的撤销操作undo
定义: <font color="#c41230">将请求封装成对象</font>,将<font color="#c41230">发出请求</font>的对象(服务员/按钮)和<font color="#c41230">执行请求</font>的对象(厨师/具体供应商)解耦 , 也可以支持<font color="#c41230">撤销</font>操作
0 条评论
下一页