背景
横穿2015年,感觉自己做了一堆傻事。随着研究生学习的深入,看到了身边各路大神,不老老实实学点东西,以后拿什么来装逼! 还是先在墙角看看书吧。针对自己毫无面向对象编程思想的现状,大约花了4天时间,读了这本书,受益颇深, 在此记录下一些东西,方便以后装逼。[感谢英俊帅气的勇神提供书籍支持]
总述
《大话设计模式》一书讲了一个“小菜”从面试受挫,一步步走向人生巅峰的故事,从对爱情、人生、理想等常见问题讨论开始, 引出面向对象程序设计的思想,是大型软件系统开发的必读书籍。
本书从面向对象基本特称:抽象性、封装性、继承性、多态性出发,重点讲述了面向对象编程的6大原则 以及遵照6条基本原则而产生的23种设计模式(简单工厂模式不符合开放-封闭原则,不计算在内)。 下面分别说明每条原则与模式的基本原理。
6大原则
单一职责原则: 一个类应该仅包含引起它变化的原因,软件设计的许多内容就是发现职责并把职责相互分离, 从而降低功能之间的耦合度,实现低耦合。
开放-封闭原则: 对扩展开放,对更改封闭。能够提高程序的可维护性、可扩展性、可复用性、灵活性。
依赖倒转原则: 抽象不应该依赖细节,细节应该依赖抽象。(针对接口的编程,不要针对实现编程)
里氏代换原则: 子类必须能够替换掉他们的父类。即子类继承父类后,并可以替换掉父类,且软件单位的功能不受影响。
迪米特法则: 如果两个类不必彼此通信,这两个类就不应该直接相互作用,如果一个类调用另一个类方法, 可以通过第三者转发这个调用。核心思想是强调类之间的松耦合。有利于类的复用。
合成/聚合复用原则: 尽量使用合成/聚合,尽量不要使用类继承。(合成:强‘拥有’关系,严格的整体和部分关系,两者有相同的生命周期。 聚合:弱‘拥有’关系,A可以包含B,但B不是A的一部分)
23种设计模式
5种创建型模式+简单工厂模式
简单工厂模式:(计算器故事)使用一个单独的类,来做创建实例的过程,这个类就是工厂。简单工厂类封装客户端逻辑。 当添加新的实例类型时,需要修改工厂的分支语句。违反了开放-封闭原则!
工厂方法模式:(雷锋故事)定义一个用于创建对象的接口,让子类决定实例化哪个类,工厂方法将实例化延迟到子类。 (从简单工厂模式的一对多,变成多对多,符合开放封闭原则,但是类选择逻辑放到了客户端,增加了客户端对具体类的依赖)
抽象工厂模式:(多数据库故事)提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。 实现1:工厂方法模式+多方法;实现2:简单工厂模式+多方法+反射。 (好处1:只需修改一次工厂,即可完成不同产品的配置; 好处2:具体类名,实例的创建与客户端分离,不会出现在客户端代码中)
建造者模式:(画小人故事)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 主要角色有:产品基类,产品类1···产品类n,指挥官,客户端。其中指挥官负责构建算法,产品类负责表示。
原型模式:(做简历故事)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新对象。 原型模式是从一个对象创建另外一个可定制对象,不需要知道创建的细节。(注意C#和JAVA直接赋值为引用赋值,浅复制)
单例模式:(MDI窗体故事)保证一个类仅有一个实例,并提供一个访问它的全局访问点。 懒汉模式:在类内采用静态变量的方式保存创建状态,注意多线程访问时,公共变量要加锁访问。 饿汉模式:使用静态变量初始化方法。自动解决多线程不安全问题。
7种结构型模式
适配器模式:(NBA翻译故事)将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的类可以一起工作。 想要一个已经存在的类,但是接口不同,且双方都不太容易修改的情况下,可以考虑适配器模式,提高类的复用性。
装饰模式:(穿衣品味故事)动态地给一个对象添加一些额外的职责,就整加功能来说,装饰模式比生成子类更为灵活。 从基类开始,不断向下传递对象,并添加新功能。最终调用时,从下向上回归调用。通过基类实现类似C语言的双向链表, 一个新节点为一个新职责。
桥接模式:(手机游戏故事)将抽象部分与它的实现部分分离,使他们都可以独立变化。实现系统可能有多角度分类, 每一个分类都有可能变化,就把多角度分离出来独立变化,通过基类与基类之间的调用,使用合成/聚合,减少类的继承, 从而减少类之间的耦合。桥接模式强调系统之间的转换,好比交换机,适配器模式强调类与类之间转换,好比网线。
组合模式:(OA分公司故事)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象 和组合对象的使用具有一致性。该模式可以创建树形结构数据,3种类:基类、叶、节点。类递归方式显示。 组合模式可以让用户忽略忽略组合对象与单个对象区别,一致访问所有对象。
享元模式:(外包项目故事)运用共享技术有效地支持大量细粒度的对象。通过Hasable标出对象,并检测是否重返创建, 享元模式通过共享大量相似的类的开销,把不同部分移到类外部,才调用时传入,达到减少内存消耗的目的。
代理模式:(追女生故事)为其他对象提供一种代理以控制对这个对象的访问。框架类似适配器模式,代理4中应用场合: 1、远程代理,不同地址空间访问;2、虚拟代理,存放实例化需要很长时间的真是对象;3、安全代理,访问权限控制; 4、智能代理。
外观模式:(基金炒股故事)为子系统中的一组接口提供一个一直的界面,此模块定义了一个高层接口, 这个接口使得这一子系统更加容易使用。外观模式主要应用在软件层次之间,为一层类中的复杂的代码关系,提供简单的接口。
11种行为型模式
观察者模式:(上班炒股故事)定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象。 当主体对象状态发生变化时,会通知所有观察者对象,使他们能够更新自己。通过List维护所有观察者,并循环调用。 改进:当观察者为不同类别时,使用事件委托实现。
模版方法模式:(考试故事)定义一个操作中算法的骨架,而将一些步骤延迟到子类中。 该方法使得子类可以不改变一个算法的结构即可从定义算法的某些参数、特定步骤。模版方法是很好的代码复用平台, 充分体现了继承的优势。
命令模式:(烤羊肉串故事)将一个请求封装为一个对象,从而可以使用不同的请求对客户端进行初始化,对请求排队, 或记录请求日志,以及支持可撤销操作。添加新请求只需要添加新类。把操作请求对象与操作执行对象分割开。
状态模式:(加班故事)当一个对象内在状态发生改变时允许改变其行为,这个对象看起来像是改变了其类。 主要解决在状态转换条件表达式过于复杂时的情况,把状态的判断转移到不同状态的一系列类中。
职责链模式:使多个对象都有机会处理请求,从而避免发送者与请求者之间的耦合关系,将对象连成一条链, 并沿着这条链传递该请求,直到有一个对象处理它为止。类是状态模式。可以简化对象之间的相互连接。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示解释句子。 当一类问题发生频率很高,可以将实例表述为一个句子,解释器通过解释句子,从而解决问题。
中介者模式:(联合国故事)用一个中介对象封装一系列对象的交互,中介者使个对象不需要现实地相互调用, 而且可以独立地改变他们之间的交互。分位注册,调用两个步骤完成。
访问者模式:(男人女人故事)表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变个元素的类的前提下, 定义作用域这些元素的新操作。适用于数据结构相对稳定,使数据和操作之间的耦合解脱开,方便增加新操作。 结构中操作名不变,新操作只需添加新类,并注册。
策略模式:(商场促销)定义算法簇,分别封装起来,相互可替换,即使算法发生变化,也不影响算法的客户。
备忘录模式:(游戏备份故事)在不破坏封装性的情况下,捕获一个对象的内部状态,并在对象之外保存, 这样可以以后恢复到原先保存的状态。(发起者、备忘录、管理者3个类)
迭代器模式:(买票故事)提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露元素的内部表示。 由于高级语言中foreach语句的出现,该模式已经逐渐被弃用。
目前疑惑
状态模式VS职责链模式
代理模式VS适配器模式
中介者模式VS桥接模式
快速阅读了解掌握了书上的一些设计模式的原理,并没有领会思想,不能灵活运用,不过所谓“知之而后行”,慢慢悟,慢慢悟!
结束
作者让我想起了我的小学老师,一个个形象的故事,点出了面向对象做事和编程的基本思想。使用教小学生的方法来讲述大学知识, 我学到的更不仅仅是大学知识。希望自己有一天也能具备讲故事的能力。
另外,想想以后自己又可以静静地装X了,心里有点小激动呢~