java设计模式:概述与GoF的23种设计模式

软件设计模式的产生背景

设计模式这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。

1977 年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。

1979 年他的另一部经典著作《建筑的永恒之道》(The Timeless Way of Building)进一步强化了设计模式的思想,为后来的建筑设计指明了方向。

1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将克里斯托夫·亚历山大的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。

直到 1990 年,软件工程界才开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。

1995 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。

直到今天,狭义的设计模式还是GoF(Gang of Four,四人组)的23种经典设计模式。

软件设计模式的概念与意义

有关软件设计模式的定义很多,有些从模式的特点来说明,有些从模式的作用来说明,这里给出的定义从两个方面来说明。

软件设计模式的概念

软件设计模式(Software Design Patern),简称设计模式,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

学习设计模式的意义

设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。

正确使用设计模式具有以下优点:

1.可以提高程序员的思维能力、编程能力和设计能力。

2.使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。

3.使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。

当然,软件设计模式只是一个引导,在具体的软件开发中,必须根据设计的应用系统的特点和要求来恰当选择。对于简单的程序开发,可能写一个简单的算法要比引入某种设计模式更加容易。只是开发大项目或者是设计框架的时候,用设计模式来组织代码显然是更好的选择。

软件设计模式的基本要素

软件设计模式使人们可以更加简单地服用成功地设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、冬季、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、 模式扩展和相关模式等。

以下是其中最关键的4个主要元素:

模式名称(PatternName)

每一个模式都有自己的名字,通常用一两个词来描述,可以根据模式的问题、特点、解决方案、工程和效果来命名。模式名称有助于我们理解和记忆该模式,也方便我们来讨论自己的设计。

问题(Problem)

问题描述了该模式的应用环境,即在什么情况下使用该模式。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。

解决方案(Solution)

模式问题的解决方案包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象的组合)来解决问题。

效果(Consequence)

效果描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩展性、可移植性的影响,也考虑其实现问题。显式地列出这些效果,对理解和评价这些模式有很大地帮助。

GoF的23中设计模式的分类

设计模式有两种分类方法,一是根据模式的目的来分,二是根据模式的作用范围来分。

根据目的来分(3种)

根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式3种。

创建型模式:用于描述怎样创建对象,它的主要特点是将对象的创建与使用分离。GoF提供了单例、原型、工厂方法、抽象工厂、创造者等5种创建型模式。

结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF提供了代理、适配器、桥接、装饰、外观、享元、组合等7种结构型模式。

行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。GoF提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等11种行为型模式。

根据作用范围来分(2种)

根据模式主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式2种。

类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF的工厂方法、(类)适配器、模板方法、解释器属于该模式。

对象模式:用于处理对象之间的关系, 这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF除了类模式中的4种,其它的都是对象模式。

通过二维表格能清晰看出GoF23种设计模式的分类。 

范围\目的 创建型模式 结构型模式 行为型模式
类模式 工厂方法(Facory Methond) 适配器(类)(Class Adapter)

模板方法(Template Method)

解释器(Interpreter)

对象模式

单例(Singleton)

原型(Prototype)

抽象工厂(Factory Method)

建造者(Buileder)

代理(Proxy)

适配器(对象)(Object Adapter)

桥接(Bridge)

装饰(Decorator)

外观(Facade)

享元(Flyweight)

组合(Composite)

策略(Strategy)

命令(Command)

职责链(Chain of Responsibility)

状态(State)

观察者(Observer)

中介者(Mediator)

迭代器(Iterator)

访问者(Visitor)

备忘录(Memento)

  

GoF的23种设计模式的功能

单例模式(Singleton):

猜你喜欢

转载自www.cnblogs.com/yanggb/p/10349993.html