一句话感悟:目的:高内聚、低耦合
底层提供抽象接口,上层提供数据存储和实现,组合先于继承 (FCoI:Favor Composition Over Inheritance)
给每一个类添加底层抽象,又便于实现高内聚、低耦合
一、设计模式使用的5个原则:
1.开闭原则:对功能开放,对修改关闭。即修改一定不要影响到已经实现的稳定的功能。->使用继承实现新的功能。
2.里氏替换原则:子类和父类可以相互替换,且不会影响到功能。->每个类都要继承至接口,类之间使用接口耦合。
3.依赖倒置原则:抽象不依赖于细节实现,实现细节依赖于抽象->接口
4.接口隔离原则:接口只做必要的事情而不做与该接口功能无关的事情。
5.合成/聚合原则:多用合成/聚合,少用继承,从而减少类之间的依赖。
二、3类设计模式
对象创建型模式:
1.factory模式:来自同一抽象底层的多个产品,可以只需使用工厂模式
2.abstractfactory模式:来自多个抽象底层的多个产品,可以用一个抽象工厂派生的多个具体工厂来管理各个不同抽象底层的产品。一个具体工厂管理一类具体产品的创建。
3.singleton模式:该对象只允许创建一次。私有构造函数+静态构造方法
4.builder模式:大型对象的创建。需要由几部分构建成。
5.prototype模式(深度复制模式):通过抽象层接口,实现深度复制。
需要实现复制构造函数,然后以this对象为参数调用复制构造函数new一个对象出来
程序结构型模式:
1.bridge模式:抽象与实现分离。以组合的形式分离需求抽象与算法实现。通过组合(代理)将需求抽象与单个算法实现分开。
2.adapter模式:以继承和组合的形式转换类的接口。调用方式为:Target* a=new Adapter(new Adaptee()) 通常考虑被适配者的实现不公开。适配器需要继承Target,并实现相应方法。
3.decorator模式:以聚合的形式给类的方法添加修饰。通过组合的方式给类添加方法,而不是直接添加到类中。可以避免给父类添加新的接口。适用于需要给一个类添加属性形成一个新的扩展类的情况。
4.composite模式(组合模式):以树的形式实现对类的访问。类中提供对同类对象指针的存储,形成树状结构,便于递归管理。
5.flyweight(轻量级)模式:以类厂的形式实现对象共享。flyweight类维护一个已创建的对象链表,每个对象自身维护一个创建时赋予的关键字。由flyweight工厂类统一创建指定键值的类,如果存在则不再创建并返回该对象指针。
6.facade(包装,外观)模式:以组合的形式实现把多个类的不同方法封装在一个方法中。太简单。比与子系统关系不够密切的方法封装在一个类中,子系统聚合该类来调用方法。这样就不用把这些不必要的方法写在子系统中。
7.proxy(代理)模式:以组合的形式封装对其他类方法的调用。
程序行为模式:
1.template模式:(挺好:底层实现算法框架,上层实现具体细节)以继承的方式,使底层抽象实现通用算法模版,上层实现算法细节,从而把算法细节封装在上层。 DIP(依赖倒置)
虚函数都是通过虚表来调用的,用谁的指针就调用谁的虚函数。
2.strategy模式:以巨聚合的方式,使抽象实现算法模版,而算法细节在被组合对象中实现。从整体中提取变化的部分,使用聚合传入变化的算法接口。可以基于该接口构造很多不同的算法类。
3.state模式:以聚合的方式,实现有限状态机。状态的公共数据都保存在Context上下文类中。允许一个对象在内部状态发生改变时,改变它的行为。
4.Observer模式:建立一个一对多的依赖关系,当一个对象(subject)状态发生变化时,通知其它对象(observer)进行相应更新。 据说是很重要的一种设计模式。
5.Memento(记忆)模式:
6.Mediator(调解)模式:专门负责提供对象间的交互,从而使得对象实现松耦合。
7.command模式:将请求的接受者放到command的具体子类concreteCommand中,当请求到来时(Invoker发出Invoke消息激活command对象),concreteCommand将处理请求交给Reveiver对象进行处理。
8.visitor模式:Visitor模式在不破坏类的前提下,为类提供增加新的新操作。Visitor模式的关键是双分派(Double-Dispatch,聚合的双方能互访文)的技术。C++语言支持的是单分派。
9.chain of responsibility 模式:(多对象同时处理一个请求)描述其实就是这样一类问题->将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求
10:iterator 模式:
11.interpreter模式:
本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1697987,如需转载请自行联系原作者