什么是设计模式?

Christopher Alexander 说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”简单来说就是:

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。

为什么有设计模式

设计模式开发的规范,最优的方案,选择合适的模式可大大提高开发效率,少走弯路。如果将设计模式比喻成“三十六计”,那么每一个模式都是一种计策,它为解决某一类问题而诞生,设计模式能很好的解决一些问题。

设计模式的原则

  1. 单一职责原则(SRP):每个类都只负责单一的功能,切不可太多,并且一个类应当尽量的把一个功能做到极致(“低耦合,高内聚”)
  2. 里氏替换原则(LSP):在任何父类出现的地方都可以用子类替换并且正常工作。
  3. 接口隔离原则(ISP):也称接口最小化原则,强调的是一个接口拥有的行为应该尽可能的小。
  4. 依赖倒置原则(DIP):高层模块不应该依赖与底层模块, 二者都应该依赖于抽象, 抽象不应该依赖于细节, 细节应该依赖于抽象。
  5. 迪米特原则(LOD):也称最小知道原则,即一个类应该尽量不要知道其他类太多的东西,不要和陌生的类有太多接触。
  6. 开闭原则(OCP):对扩展是开放的,对修改是关闭的。

设计模式的分类

经典应用框架中常见的设计模式分为三类:

  • 创建型模式:对类的实例化过程的抽象。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。包含类的创建模式和对象的创建模式。

常见的创建型模式有:Factory 工厂模式;Singleton 单例模式;Prototype 原型模式

  • 结构型模式:描述如何将类或对象结合在一起形成更大的结构。分为类的结构模式和对象的结构模式。类的结构模式使用继承把类,接口等组合在一起,以形成更大的结构。类的结构模式是静态的。对象的结构模式描述怎样把各种不同类型的对象组合在一起,以实现新的功能的方法。对象的结构模式是动态的。

常见的结构型模式有:Adapter 适配器模式;Decorator 装饰器模式;Proxy 代理模式

  • 行为型模式:对在不同的对象之间划分责任和算法的抽象化。不仅仅是关于类和对象的,并是关于他们之间的相互作用。类的行为模式使用继承关系在几个类之间分配行为。对象的行为模式则使用对象的聚合来分配行为。

常见的行为型模式有:Strategy 策略模式;Template 模板模式;Delegate 委派模式;Observer 观察者模式

设计模式使用频率排行

频率

所属类型

模式名称

模式

简单定义

5

创建型

Singleton

单件

保证一个类只有一个实例,并提供一个访问它的全局访问点。

5

结构型

Proxy

代理

为其他对象提供一种代理以控制对这个对象的访问

5

行为型

Observer

观察者

定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。

5

行为型

Template Method

模板方法

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,Template Method使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。

4

创建型

Factory Method

工厂方法

定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。

4

结构型

Adapter

适配器

将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。

4

结构型

Decorator

装饰

动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。

4

行为型

Strategy

策略模式

定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。

2

创建型

Prototype

原型

用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

注意:在常用的23种设计模式中其实面没有委派模式(Delegate)的影子,但是在Spring中委派模式确实用的比较多的一种模式,Spring MVC框架中的DispatcherServlet其实就用到了委派模式。

单例模式(Singleton)

单例模式:Singleton的作用是保证在应用程序中,一个类Class只有一个实例存在。并提供全局访问。Singleton限制了实例个数,有利于GC的回收。

策略模式(Strategy)

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

原型模式(Prototype)

原型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法

因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单。

工厂模式(Factory)

工厂模式:定义一个用于创建对象的接口,让接口子类通过工厂方法决定实例化哪一个类。

装饰模式(Decorator)

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机。Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能。

适配器模式(Adapter)

适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端
将两个不兼容的类纠合在一起使用,属于结构型模式,需要Adaptee(被适配者)和Adaptor(适配器)两个身份。

为何使用?
我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿)。

如何使用?
实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance)。

代理模式(Proxy)

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。

某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

观察者模式(Observer)

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。发布订阅。

模板模式(Template)

模板模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。

不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

猜你喜欢

转载自blog.csdn.net/learnnewer/article/details/88784540