设计模式一 介绍
1、概念
模式:在一定的环境中解决某一问题的方案。三个基本元素:环境、问题、解决方案。
设计模式:针对某一个软件设计问题的可重用的解决方案。是一套被反复使用、多人知晓的代码设计经验的总结。
分类:创造型模式、结构型模式、行为型模式
创造型模式:描述了如何动态创建对象的决定。包含类的创建模式和对象的创建模式。【FA BPS】【5种】
简单工厂模式、工厂方法模式F、抽象工厂模式A、建造者模式B、原型模式P、单例模式S
结构型模式:用于处理类或对象的组合。描述如何将类或者对象结合在一起形成一个更大的结构。【ABCDFFP】【7种】
类的结构模式是静态的(继承)。对象的结构模式是动态的(组合)。
适配器模式A、桥接模式B、组合模式C、装饰者模式D、外观模式F、享元模式F、代理模式P
行为型模式:用于描述类或对象如何交互,如何分配职责。对在不同的对象之间划分责任和算法的抽象化。【CIM OST V】【11种】
类的行为模式使用继承分配行为。对象的行为模式使用聚合分配行为。
责任链模式C、命令模式C、解释器模式I、迭代器模式I、中介者模式M、备忘录模式M、观察者模式O、策略模式S、状态模式S、模板方法模式T、访问者模式V

2、六大设计原则:
单一职责原则
开放封闭原则
依赖倒置原则:抽象不应该依赖细节
里氏代换原则:子类必须能够替换掉他们的基类
迪米特法则:不希望类之间建立直接的接触(友元,中间类)
接口隔离原则 :客户端不应该依赖它不需要的接口(接口中的方法尽量少)
345、一句话总结
3.1、工厂方法模式(Factory Method):定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
典型场景:
3.2、抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖的接口,而无需指定它们具体的类。提供创建一系列产品族的工厂机制。(易于产品系列切换)
典型场景:
3.3、建造者模式(Builder): 将一个复杂的构建与其表示相分离,使得同样的构建过程(套餐)可以创建不同的表示。

典型场景:套餐(种类固定,但是可以随意组合)。
3.4、原型模式(Prototype):指明所要创建的对象的类型,然后用(拷贝构造)复制这个原型对象的方法创建出更多同类型的对象。
典型场景:复印技术,短信群发
3.5、单例模式(Singleton):【饿汉模式、懒汉模式】
典型场景:任务管理器、回收站、网站计数器、config配置、线程池、数据库连接池
4.1、适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。【类适配器和对象适配器】


典型场景:充电器
4.2、桥接模式(Bridge): 将抽象部分与实际部分分离(用聚合代理继承),使得二者可以独立的变化。也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。(有超过一维的变化我们就可以用桥模式。如果只有一维在变化,那么我们用继承)

典型场景:画图(可以画园、三角等,可以在pdf上画,可以在doc上画)
4.3、组合模式(Composite):将对象组合成树形结构以表示“部分--整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性 根据实现接口分【安全模式和透明模式】

典型场景:设备树,windows的目录树
4.4、装饰者模式(Decorator):动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。

典型场景:
4.5、外观模式(Fascade):定义了一个高层接口,该接口为子系统中的一组接口提供一个一致的界面,使得这一子系统更加容易使用
应用场景:基金与股票的关系,数据库JDBC的应用,Session的应用,开关(四驱车开关,子系统中的马达、电池等结构和运行原理不需要知道)
4.6、享元模式(Flyweight): 以共享的方式高效的支持大量的细粒度的对象。【FlywightFactory:std::map<xx,Flyweight>】

典型场景:字体的26个字母和各自的斜体等
4.7、代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

应用场景:智能指针(引用计数的方式管理内存),foxmail,
5.1、责任链模式(Chain of Repository):很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
典型场景:喝酒时通过成语接龙决定谁喝酒(马到成功-功不可没-没完没了)
5.2、命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

典型场景:服务员点餐,厨师做饭。上网 IE 输入 http地址 发送命令。
5.3、解释器模式(Interpreter):
5.4、迭代器模式(Iterator):
5.5、中介者模式(Mediator):定义一个中介对象来封装 系列对象之间的交互。中介者使各个对象不需要显示的相互调用 ,从而使其耦合性松散,而且可以独立的改变他们之间的交互。【迪米特法则】

典型场景: 法院和原告,被告的关系
5.6、备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

典型场景:游戏存档。undo/redo。
5.7、观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

典型场景:邮件系统中everyone@xx.com的应用
5.8、状态模式(State):允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。行为改变状态,状态决定行为。

典型场景:人心情不同时表现不同有不同的行为
5.9、策略模式(Stratgy):准备一组算法,并将每一个算法封装起来,使得它们可以互换
针对一组算法(算法家族),将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

典型场景:图书销售算法(不同书本折扣的算法)
5.10、模板方法模式(Template):使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
典型场景:网页设计时使用的模板架构网页
5.11、访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

典型场景:
浙公网安备 33010602011771号