顿搜
大话23种设计模式——JAVA/C++ 面向对象程序设计
所谓模式,指描述了一个在我们的环境中不断出现的问 题,然后描述了该问题的解决方案的核心,通过这种 方式,我们可以无数次地重用那些已有的解决方案, 无需再重复相同的工作。
设计模式是“封装变化”方法的最佳阐述。寻找软件中可能的变化,并封装这些变化。
设计模式的精髓:料敌机先,活学活用。
一、23种设计模式
二、七大原则
考虑一个设计是否恰当时,不能孤立的看待并判断,应该从此 设计的使用者所作出的假设来审视它。
1、单一职责原则(SRP)
就一个类而言,应该只有一个导致其变化的原因,一个类如果承担的职责过多,就等于将这些职责 耦合在一起。一个职责的变化可能会虚弱或者抑 止这个类完成其它职责的能力 。多职责将导致脆弱性的臭味。
- ①、 一个类(或者大到模块,小到方法)承担的职责越多,它 被复用的可能性越小
- ②、单一职责原则是实现高内聚、低耦合的指导方针,,一个类只负责一个功能领 域中的相应职责。
2、开-闭原则(OCP)
设计一个模块时,应当使该模块在不被修改的前提下 被扩展,即可在不必修改源代码的情况下改变该模块 的行为。开闭原则由Bertrand Meyer于1988年提出,它是 面向对象设计中最重要的原则之一。对扩展是开放的,对更改是封闭的 。
- ①、抽象化是开闭原则的关键
- ②、对可变性封 装原则,要求找到系统的可变 因素并将其封装起来。
- ③、没有对所有变化的情况都封闭的模型
3、LisKov替换原则(LSP)
一个软件实体如果使用的是一个基类的话,一 定适用于其子类,而且根本不能觉察出基类 对象和子类对象的区别。
- ①、违反这个职责将导致程序的脆弱性和对OCP的违反
- ②、程序中尽量使用基类类型对对象进行定义,而在运行时再确定其子类类型,用子类对象替换父类对象。
- ③、尽量从抽象类继承,而不从具体类继承
- ④、继承关系形成的等级结构中,树上面所有的叶节点应该是具体类, 所有的树枝节点应该是抽象类或接口。
4、依赖倒置原则(DIP)
高层模块不应该依赖低层模块,它们都应该依赖抽象。 抽象不应该依赖于细节,细节应该依赖于抽象。要针对接口编程,不要针对实现编程。面向对象程序设计倒置了依赖关系结构,使细 节和策略都依赖于抽象,成为面向对象设计的 标志。
- ①、代码要依赖于抽象的 类,而不要依赖于具体的类;要针对接口或抽象类编程, 而不是针对具体类编程。
- ②、如果说开闭原则是面向对象设计的目标的话, 那么依赖倒臵原则就是面向对象设计的主要手段。
- ③、的常用实现方式之 一是在代码中使用抽象类,而将 具体类放在配臵文件中。
- ④、以抽象方 式耦合是依赖倒臵原则的关键。
5、接口隔离原则(ISP)
使用多个专门的接口比使用单一的总接口要好,一个类对另外一个类的依赖性应建立在最小的接口上。 一个类的不内聚的“胖接口”应该被分解成多组方 法,每一组方法都服务于一组不同的客户程序。每一个接口应该承担一种相对独立的角色, 不多不少,不干不该干的事,该干的事都要干。
- ①、 一个接口只代表一个角色,每个角色都有它特定的一个接口,此时这个原则可以叫做“角色隔离原则”。
- ②、接口仅仅提供客户端需要的行为,应当为客户端提供 尽可能小的单独的接口,而不要提供大的总接口。
- ③、使用接口隔离原则拆分接口时,首先必须满足单一职 责原则。
- ④、将没有关系的接口合并在一起,形成一个臃肿 的大接口,是对角色和接口的污染。
6、组合/聚合复用原则(CARP)
在一个新的对象里面使用一些已有的对象, 使之成为新对象的一部分,新对象通过向这 些对象的委派达到复用已有功能的目的。
- ①、 继承是类型的复用。从超类继承而来的实现是静态的,不能在运行时发生改变,因此没有足够的灵活性。
- ②、组合/聚合将已有的对象纳入新对象中,使之成 为新对象的一部分,因此新对象可以调用已有对象的功能
- ③、组合与继承都是重要的复用方法 。要尽量使用组合 / 聚合,尽量不要使用继承。
- ④、组合与继承可以一起工作 ,优先使用对象组合,而非(类)继承
7、迪米特法则(LoD)
迪米特法则(LoD)最初是用来作为面向对象的系统设 计风格的一种法则,是很多著名系统。一个对象应该对其他对象有尽可能少的了解,每一个软件单位对其他的单位都只有最少的知识,而且局限 于那些与本单位密切相关的软件单位。
- ①、如果两个类不必彼此直接通信,那么这两个类就不应 当发生直接的相互作用。
- ②、如果其中的一个类需要调用另一个类的某一个方法的 话,可以通过第三者转发这个调用。
- ③、类的结构设计上,每个类应降低成员的访问权限,类的设计上,只要有可能,设计成不变类。
- ④、对其他类的引用上,对其他对象的引用应该降到最低。
三、模式分类
设计模式可以分为三类:创建型模式,结构型模式,行为型模式。面向对象的设计模式中,最重要的是GOF和GRASP(通用职责分配软件模式),GRASP包含9种设计模式。
1、创建型模式
创建型模式的目的就是封装对象创建的变化,是对类的实例化过程的抽象化,能够将软件模块中对象的创建和对象的使用分离。
- ①、类的创建模式:把类的创建过程延迟到子类(基于继承实现)。
- ②、对象的创建模式:把创建对象委派给另一个对象(基于组合/聚合实现)
2、结构型模式
结构型模式关注的是对象之间组合的方式。如何将现有类或对象组织在一起形成更加强大的结构。
- ①、不同的结构型模式从不同的角度来组合类和对象。
- ②、类的结构模式:类的结构模式使用继承把类、接口等组合在一起,以形成更大的结构。
- ③、对象的结构模式:对象的结构模式描述了怎样把各种不同类型的对象组合在一起,以实现新功能的方法。
3、行为型模式
行为模式是对在不同的对象之间划分责任和算 法的抽象化。
- ①、行为模式不仅仅是关于类和对象 的,而且关注它们之间的通信模式。
- ②、行为型模式关注的是对象的行为。
- ③、类的行为模式:使用继承关系在几个类之间分配行为
- ④、对象的行为模式:使用对象的聚合来分配行为
总结
- 1、单一职责原则(SRP)是基本
- 2、开-闭原则(OCP)是目的
- 3、依赖倒臵原则(DIP) 为手段
- 4、LisKov替换原则(LSP)是继承复用的基础
- 5、接口隔离原则(ISP)是实现迪米特法则LoD的手段之一
- 6、组合/聚合复用原则(CARP)是复用的原则