设计模式——概述

设计模式——概述

设计模式(Design pattern)是一套被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,能够称得上是软件工程的基石。java

GoF的“设计模式”是第一次将设计模式提高到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程当中,新的大量的设计模式不断出现。数据库

项目中合理的运用设计模式能够完美的解决不少问题,每种模式如今都有相应的原理来与之对应,每个模式描述了一个在咱们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被普遍应用的缘由。编程

1、设计模式和框架

如今,可复用面向对象软件系统如今通常划分为三大类:应用程序工具箱和框架(Framework),咱们平时开发的具体软件都是应用程序;JavaAPI属于工具箱;而框架是构成一类特定软件可复用设计的一组相互协做的类。设计模式

框架一般定义了应用体系的总体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用自己的特定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,所以框架设计中必然要使用设计模式.并发

另外,设计模式有助于对框架结构的理解,成熟的框架一般使用了多种设计模式,若是你熟悉这些设计模式,毫无疑问,你将迅速掌握框架的结构,咱们通常开发者若是忽然接触EJB等框架,会以为特别难学,难掌握,那么转而先掌握设计模式,无疑是给了你剖析EJB的一把利器。框架

2、设计模式的原则

近年来,你们都开始注意设计模式。那么,到底咱们为何要用设计模式呢?这么多设计模式为何要这么设计呢?根本缘由是为了代码复用,增长可维护性。那么怎么才能实现代码复用呢?OO界有前辈的几个原则:“开-闭”原则(Open Closed Principal)、里氏代换原则、合成复用原则。设计模式就是实现了这些原则,从而达到了代码复用、增长可维护性的目的。ide

1、“开-闭”原则工具

此原则是由“Bertrand Meyer”提出的。原文是:“Software entities should be open for extension,but closed for modification”。就是说模块应对扩展开放,而对修改关闭。模块应尽可能在不修改原(是“原”,指原来的代码)代码的状况下进行扩展。那么怎么扩展呢?咱们看工厂模式“factory pattern”:假设中关村有一个卖盗版盘的小子,咱们给他设计一“光盘销售管理软件”。咱们应该先设计一“光盘”接口。而盗版软件和盗版电影是其子类。小子经过“DiscFactory”来管理这些光盘。代码为:spa

public class DiscFactory{ 线程

public static 光盘 getDisc(String name){

return (光盘)Class.forName(name).getInstance();

}

}

有人要买盗版软件,怎么实现呢?

public class 小子{

public static void main(String[] args){

光盘 d=DiscFactory.getDisc("盗版软件");

光盘.();

}

}

若是有一天,这小子良心发现了,开始卖正版软件。不要紧,咱们只要再建立一个“光盘”的子类“正版软件”就能够了。不须要修改原结构和代码。怎么样?对扩展开发,对修改关闭,“开-闭原则”。

工厂模式是对具体产品进行扩展,有的项目可能须要更多的扩展性,要对这个“工厂”也进行扩展,那就成了“抽象工厂模式”。

2、里氏代换原则

里氏代换原则是由“Barbara Liskov”提出的。若是调用的是父类的话,那么换成子类也彻底能够运行。好比:

光盘 d=new 盗版盘();

d.();

如今要将“盗版软件”类改成“盗版电影”类,没问题,彻底能够运行。Java编译程序会检查程序是否符合里氏代换原则。还记得java继承的一个原则吗?子类 overload方法的访问权限不能小于父类对应方法的访问权限。好比“光盘”中的方法“卖”访问权限是“public”,那么“盗版软件”和“盗版电影”中的“卖”方法就不能是packageprivate,编译不能经过。为何要这样呢?若是“盗版软件”的“卖”方法是private。那么下面这段代码就不能执行了:

光盘 d=new 盗版软件();

d.();

能够说:里氏代换原则是继承复用的一个基础。

3、合成复用原则

就是说要少用继承,多用合成关系来实现。咱们可能曾经这样写过程序:有几个类要与数据库打交道,就写了一个数据库操做的类,而后别的跟数据库打交道的类都继承这个。结果后来,我修改了数据库操做类的一个方法,各个类都须要改动。“牵一发而动全身”!面向对象是要把波动限制在尽可能小的范围。

Java中,应尽可能针对Interface编程,而非实现类。这样,更换子类不会影响调用它方法的代码。要让各个类尽量少的跟别人联系,扩展性和维护性才能提升。

4、依赖倒转原则

抽象不该该依赖于细节,细节应当依赖于抽象。

要针对接口编程,而不是针对实现编程。

传递参数,或者在组合聚合关系中,尽可能引用层次高的类。

主要是在构造对象时能够动态的建立各类具体对象,固然若是一些具体类比较稳定,就没必要再弄一个抽象类作它的父类,这样有多此一举的感受

5、接口隔离原则

定制服务的例子,每个接口应该是一种角色,很少很多,不干不应干的事,该干的事都要干。下降依赖,下降耦合。

6、抽象类

抽象类不会有实例,通常做为父类为子类继承,通常包含这个系的共同属性和方法。

注意:好的继承关系中,只有叶节点是具体类,其余节点应该都是抽象类,也就是说具体类是不被继承的。将尽量多的共同代码放到抽象类中。

7、迪米特法则

最少知识原则。就是说:一个实体应当尽可能少的与其余实体之间发生相互做用,使得系统功能模块相对独立。

3、设计模式的分类

整体来讲设计模式分为三大类:

建立型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。

上述各类设计模式将在接下来的一系列文章中为你们一一呈现,敬请关注。

相关文章
相关标签/搜索