设计模式专栏(1)—— 概述

该专栏是为了让lz更通俗地理解这个高深的设计模式,希望也可以帮助到你。

专栏目录:

(1)概述

(2)创建型模式之抽象工厂模式、工厂方法模式、建造者模式、原型模式、单例模式;

(3)结构型模式之适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式;

(4)行为型模式之职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。

设计模式(即:使代码编写真正工程化):

定义:

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(来自百度百科)。

 分类:

设计模式一共分为三种类型:创建型模式、结构型模式、结构型模式。

创建型模式:

主要用于创建对象。主要是想将系统使用的具体类封装起来,隐藏这些类的实例构建和结合的方式。包含的设计模式有抽象工厂模式、工厂方法模式、建造者模式、原型模式、单例模式这5种。

结构型模式:

用于处理类或对象的组合,它提供类和对象之间如何更好组合的方式。是从程序的结构上解决模块之间的耦合问题。包含的设计模式有适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式;

行为型模式:

用于描述对象是怎样交互和怎样分配职责,不仅要描述对象,还要描述对象之间的通信方式。包含的设计模式有职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。

设计模式要满足的几大原则:

我在讲原则之前,我想先说说耦合和内聚这两个词的概念和理解:

1.耦合

对象之间的耦合度指的是对象之间的依赖度,指导使用和维护对象的主要问题是对象之间的多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 

所以耦合描述的是两个模块之间的关系。

2.内聚

内聚(Cohesion)是一个模块内部各成分之间相关联程度的度量。标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

所以内聚描述的是一个模块内部的关系。

因此一个好的设计应该是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。跟自己内部的关系要强大,要少依赖别人。

1.单一职责原则(SRP)

顾名思义,单一职责就是说对一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。

一个模块满足单一职责原则就实现了解耦和增强了内聚性。

2.开放-关闭原则(OCP)

定义:软件实体对于扩展是开放的,对于修改是关闭的。

优点:

(1)可复用性好:我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的功能,非常灵活。因此,这个软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。
(2)可维护性好:由于对于已有的软件系统的组件,特别是它的抽象底层不去修改,因此,我们不用担心软件系统中原有组件的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。

3.依赖倒转原则(DIP)

定义:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

简单来说,就是要实现面向接口编程。这样这大大降低了客户程序与实现细节的耦合度,只要抽象不变,客户程序就不需要变化。

4.接口隔离原则(ISP)

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。使用多个专门的接口比使用单一的总接口要好。

一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。

简单来说,我们应该满足一个接口负责一种职责,然后类实现的时候就去实现自己的责任接口。

5.迪米特原则(LKP)——最少知道原则

定义:一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

6.里氏代换原则(LSP)

定义:任何基类可以出现的地方子类一定可以出现。

里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

7.合成复用原则(CARP)

定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,尽量不要使用继承。

简单来说:就是少用继承,多用聚合。

后记:下一次就开始正式更新那23个设计模式了,期待吧!!!

 

原文地址:https://www.cnblogs.com/Gabby/p/6550585.html