通过代码示例学习GOF 设计模式(第11章GOF装饰器模式)

合集下载

J2EE项目实训 Spring框架技术——第11章 与Spring框架相关的设计模式(第4部分)

J2EE项目实训 Spring框架技术——第11章 与Spring框架相关的设计模式(第4部分)

第11章与Spring框架相关的设计模式(第4/4部分)1.1模板方法模式及应用示例1、什么是模板方法模式(1)模板方法模式在 GOF的模式分类中属于行为模式行为型模式主要解决如何实现“算法”和“对象间职责”的分配。

主要解决在软件开发过程中,对于某一项任务,由于经常存在有稳定的整体操作结构,但在具体实现过程中的各个细节过程中所涉及的子步骤却有很多改变的可能。

(2)什么是模板方法模式GOF在他们的“设计模式”书中给模板方法的定义是:模板方法模式定义一个操作中功能实现的基本骨架(也可以理解为根据需求而设计出的业务流程),而将一些功能的实现细节转移到由其子类来实现。

这样将可以使得子类在不改变业务流程的前提下即可重定义该业务流程中的某些特定步骤的实现。

其实在面向对象的Java编程中对抽象类进行功能的继承和扩展,就是在应用模板方法模式。

因此模板方法模式应该是使用很普遍并且比较容易理解和使用的一种模式。

2、模板方法模式应用了面向对象中的继承技术模板方法模式是一个很简单并且被广泛应用的一种设计模式。

其之所以简单是因为在这个模式中仅仅使用到了继承关系。

尽管在面向的编程技术中倡导“面向接口编程实现”,其实,继承还是有很多自身的优点所在。

合理地利用继承关系,同样也能够对应用系统的系统设计起到良好的作用。

而模板方法模式的应用就是合理地应用继承关系的一个典型示例。

3、模板模式能够分离应用系统中的“不变部分”与“预测可变部分”(1)如何分离应用系统中的“不变部分”与“预测可变部分”设计一个可扩展和可升级的应用系统,关键是要把系统各个模块中不变部分与预测可变部分能够隔离,以防止系统在升级过程中导致对原来的基本功能实现的代码产生干扰。

而实现这种分离可以有多种实现方式,一般来说可以从纵向、横向以及外围三个方面考虑。

而应用模板方法模式是实现纵向分离的一个常用的方法。

(2)使用模板方法使系统扩展性增强,并且最小化了应用系统中的变化而造成的对应用系统的负面影响。

装饰器模式详解及代码实现

装饰器模式详解及代码实现

装饰器模式详解及代码实现1. 什么是装饰器模式?装饰器模式是一种结构型设计模式,它允许你在运行时动态地添加行为或修改类功能,而不需要修改原始类的代码。

使用装饰器模式,你可以将对象功能分成单独的部分,然后组合这些部分以创建更加复杂的行为。

装饰器模式是面向对象编程中的一种非常重要的设计模式,也是 Python 语言中广泛使用的一项技术。

2. 装饰器模式的应用场景有哪些?装饰器模式的应用场景很多,下面主要介绍几种典型的情况。

2.1. 在不修改一个对象的前提下,在运行时给对象添加功能。

这个功能可以是动态的,可以在运行时轻松地添加和移除。

例如,你可以动态地向一个已经实例化的对象中添加新的方法和属性。

2.2. 在保持对象的接口和行为不变的前提下,为对象添加功能和行为。

例如,你可以使用装饰器模式为一个基础组件添加缓存、日志记录等功能,而不需要修改组件的代码。

2.3. 作为一种高阶编程技术,利用装饰器模式可以实现函数的函数式编程,使得代码更加简洁、可读性更高。

例如,可以使用装饰器来简洁地实现函数的计时、缓存等功能。

3. 装饰器模式的实现在 Python 中,装饰器主要是通过函数和类来实现的。

下面分别介绍这两种实现方式。

3.1. 使用函数来实现装饰器使用函数来实现装饰器是 Python 中最为常用的实现方式。

下面是一个例子:```pythondef my_decorator(func):def wrapper():print("Before the function is called.")func()print("After the function is called.")return wrapperdef say_hello():print("Hello World!")say_hello = my_decorator(say_hello)# 调用被装饰的函数say_hello()```在这个例子中,首先定义了一个装饰器函数 `my_decorator`,它接受一个函数作为参数。

Go语言中的设计模式与经典应用场景解析

Go语言中的设计模式与经典应用场景解析

Go语言中的设计模式与经典应用场景解析在软件开发领域中,设计模式是一种被广泛应用的思想和技术,用于解决常见的软件设计问题。

Go语言是一种简洁高效的编程语言,它提供了丰富的工具和库,使得设计模式在Go语言中的应用变得更加便捷和有效。

本文将深入探讨Go语言中的一些常见设计模式,并解析它们在实际应用场景中的经典应用。

1. 单例模式(Singleton Pattern):单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。

在Go语言中,可以使用sync包中的Once类型来实现单例模式。

一个经典的应用场景是数据库连接池。

通过使用单例模式,可以实现只创建一个数据库连接池实例,并通过全局访问点来获取该实例,以提升性能和资源利用效率。

2. 工厂模式(Factory Pattern):工厂模式是一种创建型设计模式,它提供了一种统一的方式来创建对象,隐藏了对象的具体实现细节。

在Go语言中,可以使用函数来作为简单工厂来创建对象。

一个经典的应用场景是日志记录器工厂。

通过使用工厂模式,可以将具体的日志记录器的实现细节隐藏起来,并通过工厂方法来创建不同类型的日志记录器。

3. 观察者模式(Observer Pattern):观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并更新。

在Go语言中,可以使用channel来实现观察者模式。

一个经典的应用场景是事件通知系统。

通过使用观察者模式,可以实现将事件的产生和处理相分离,并提供一种灵活的机制来通知相关的对象。

4. 装饰器模式(Decorator Pattern):装饰器模式是一种结构型设计模式,它允许在不修改原始对象的情况下,动态地添加或修改对象的功能。

在Go语言中,可以使用匿名组合和函数来实现装饰器模式。

一个经典的应用场景是HTTP请求的处理链。

通过使用装饰器模式,可以在请求的处理过程中透明地添加中间件,如身份验证、日志记录等。

GOF的种设计模式

GOF的种设计模式

GOF的23种设计模式一、创立型模式Abstract Factory:提供一个创立一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

.Builder:将一个复杂对象的构件与它的表示别离,使得同样的构建过程可以创立不同的表述。

.Factory Method:定义一个用于创立对象的接口,让子类决定将哪一个类实例化。

.Factory Method使一个类的实例化延迟到其子类。

.Prototype:用原型实例指定创立对象的种类,并且通过拷贝这个原型来创立新的对象。

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

.二、结构型模式Adapter:将一个类的接口转换成客户期望的其它一个接口。

.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

.Bridge:将抽象局部与它的完成局部别离,使它们都可以独立地变化。

.Composite:将对象组合成树型结构以表示“局部-整体〞的层次结构。

.Composite 使得客户对单个对象和复合对象的使用具有一致性。

.Decorator:动态地给一个对象添加一些额外的职责。

.就扩展功能而言,Decorator 模式比生成子类方法更为灵敏。

.Facade:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加简单使用。

.Flyweight:运用共享技术有效地支持大量细粒度的对象。

.Proxy:为其他对象提供一个代理以操作对这个对象的访问。

.三、行为型模式Chain of Responsibility:为解除请求的发送者和接受者之间耦合,而使多个对象都有时机处理这个请求。

.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

.Command:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

.Interpreter:给定一个言语,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释言语中的句子。

面向对象程序设计中的GOF设计模式研究

面向对象程序设计中的GOF设计模式研究

面向对象程序设计中的GOF设计模式研究在现代软件开发中,面向对象编程是一种非常流行的编程范式,它把现实世界中的事物看作是对象,并且把这些对象组合成一个完整的系统。

GOF设计模式是一种基于面向对象编程思想的软件设计模式,它帮助程序员更好地组织软件架构,提高代码的可维护性和可扩展性。

本文将探讨GOF设计模式在面向对象程序设计中的运用及优势。

一、GOF设计模式是什么?GOF是四位著名的软件工程师Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides的姓氏的首字母缩写,他们在1995年发表了一本名为《设计模式:可重用面向对象软件的基础》的书。

这本书是软件行业中重要的著作之一,其中提供了23种常用的设计模式。

GOF设计模式是一种面向对象编程思想的软件设计模式,它是建立在OOP思想基础上的。

GOF设计模式为软件开发人员提供了一种通用的解决方案,以解决不同类型的问题。

这些模式通常被分类为三类:创建型,结构型和行为型。

二、GOF设计模式的分类及用途1、创建型设计模式创建型设计模式是用来解决创建对象的问题。

例如,如何创建对象,以及何时和如何初始化对象。

共有五种创建型模式,分别是:单例模式(Singleton Pattern):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

工厂模式(Factory Pattern):为创建对象定义一个接口,但由子类决定要实例化的类是哪一个。

工厂方法让类把实例化推迟到子类。

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。

建造者模式(Builder Pattern):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

跟我学GOF程序代码编程中的各种设计模式——桥接设计模式

跟我学GOF程序代码编程中的各种设计模式——桥接设计模式

1.1跟我学GOF程序代码编程中的各种设计模式——桥接设计模式1.1.1桥接(Bridge)模式1、桥模式“将抽象部分与它的实现部分分离,使它们都可以独立变化”,这是GoF在《设计模式》艺术中的解释,这里的抽象类的实现,一般是在不同的层次中解决。

抽象和实现各自成为一个对象体系,它们由一个桥连接起来,可以各自发展各自的对象层次,而不必顾虑另一方面。

这就是Bridge模式所提供的思想。

Bridge模式更可以提供在各个不同的实现中动态的进行切换,而不必从新编译程序。

2、桥模式的应用场合在如下情况下可以使用桥接模式:1)不希望在业务和业务软件之间存在固定的绑定关系。

2)希望类的抽象和实现部分可以扩充。

3)修改实现部分对用户不产生影响。

4)复用实现部分,由于实现部分所处的层次较低,因此可以和多种业务模块复用。

3、Java 中的AWT即是使用桥接模式简单来讲,AWT提供对程序员的是对窗体界面系统的抽象,而在内部实现中,针对每一种操作系统,分别有不同实现,这就是同位体(Peer)的概念。

当程序员调用AWT对象时,调用被转发到对象所对应的一个Peer上,在由Peer调用本地对象方法,完成对象的显示。

例如,如果你使用AWT创建了一个Menu类的实例,那么在程序运行时会创建一个菜单同位体的实例,而由创建的同位体的来实际执行菜单的现实和管理。

不同的系统,有不同的同位体实现,Solaris JDK将产生一个Motif菜单的同位体,Windows下的JDK将产生一个Windows的菜单的同位体,等等。

同位体的使用,使得交叉平台窗口工具的开发变得极为迅速,因为同位体的使用可以避免重新实现本地窗口控件中已经包含的方法。

实际上,从设计的角度来看,这是一个抽象和实现分离的过程--AWT是抽象,同位体是实现,抽象和实现各自成为一个对象体系,它们由一个桥连接起来,可以各自发展各自的对象层次,而不必顾虑另一方面。

这就是Bridge模式所提供的思想。

通过代码示例学习GOF设计模式(第9章GOF模板方法模式)

通过代码示例学习GOF设计模式(第9章GOF模板方法模式)

通过代码示例学习GOF设计模式(第9章GOF模板方法模式)前言软件开发工作从本质上属于创造性的工作,它是一种将“软件产品”从无到有生的创建过程。

行业内流行的“站在巨人的肩膀上”、“不要重复地发明轮子”、“不要不断地重复自己”等“名言警句”其实都是对“软件复用”思想的具体体现。

面向对象程序设计方法提供了类级别的重用;而基于“组件化”的复用方式,已使软件系统产品在质量保证、开发效率等方面得到了更大的提高;面向框架级的系统集成开发(如J2EE中的SSH、、PHP的LAMP等),不仅可以实现组件级别的重用,而且在系统的总体架构、软件设计思想等方面都可以得到重用。

因此“面向对象”、“组件化”、“基于XML的数据结构描述”、“面向框架”等设计思想和实现技术,更使得软件系统的“复用”达到了一个更深的层次,随之而来的各种企业级“中间件组件”、AOP、SOA等技术的出现,也使得开发者的主要精力可以越来越多地关注于应用系统的业务逻辑和业务数据,而非系统“底层”的具体实现技术和各个不同技术平台之间、各个数据库系统之间的差异。

作者接触很多高校计算机软件专业类的教师和学生,深感目前的计算机软件开发类专业的程序设计类各个课程在教学方面的欠缺,不仅编码不规范(胡写代码和混乱命名)、技术深度不足(学C语言不学习指针、学Java不学习集合、反射和范型),而且程序代码还存在许多不可靠、性能低下、扩展性差等方面的问题;国内许多“小作坊”型的软件公司人员不断地生产出大量的“垃圾代码”,从而使得这些软件公司的项目都是“一次性买卖”,客户方受骗后再也没有第二次的项目开发。

作者根据自身多年的软件开发实践和经验总结,结合多年的IT职业培训的教学和高校软件学院一线的教学工作体验,在本系列文档中通过具体的程序代码示例为读者介绍GOF 设计模式及相关的应用技术。

主要的目的是希望能够以成功的经验或者失败的教训为读者减少软件开发失败的风险,同时也为高校师生总结出如何能够编程开发出一个“易读的”、“易维护的”、“易扩展”、“高性能”和“可重用”的系统程序。

gof 23 种设计模式解析附 c语言

gof 23 种设计模式解析附 c语言

gof 23 种设计模式解析附 c语言在计算机科学中,设计模式(Design Patterns)是一套被反复使用的,多数人知道的,经过分类编目的,代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

GoF 23种设计模式是设计模式中最经典和最常用的部分,这些模式主要用于解决特定类型的问题。

下面是这些设计模式的C语言解析:1. 工厂方法模式(Factory Method Pattern)```c#include <stdio.h>// 抽象产品类struct AbstractProduct {void use() {printf("AbstractProduct\n");}};// 具体产品类1struct ConcreteProduct1 : public AbstractProduct { void use() {printf("ConcreteProduct1\n");}};// 具体产品类2struct ConcreteProduct2 : public AbstractProduct { void use() {printf("ConcreteProduct2\n");}};// 抽象工厂类struct AbstractFactory {virtual AbstractProduct* createProduct() = 0; };// 具体工厂类1struct ConcreteFactory1 : public AbstractFactory {AbstractProduct* createProduct() {return new ConcreteProduct1;}};// 具体工厂类2struct ConcreteFactory2 : public AbstractFactory {AbstractProduct* createProduct() {return new ConcreteProduct2;}};int main() {ConcreteFactory1 factory1;ConcreteProduct1* product1 = factory1.createProduct(); product1->use(); // 输出 "ConcreteProduct1"delete product1; // 释放内存factory1.createProduct(); // 空指针异常,因为工厂已不再生产任何产品return 0;}```。

跟我学GOF程序代码编程中的各种设计模式——状态设计模式

跟我学GOF程序代码编程中的各种设计模式——状态设计模式
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
1.1 跟我学 GOF 程序代码编程中的各种设计模式——状态设计模式
1.1.1 状态(State)设计模式
1、State 设计模式 不同的状态对应着不同的行为,或者说每个状态有着相应的行为。
2、何时使用 State 设计模式 State 模式在实际使用中比较多,适合“状态的切换”。因为我们经常会使用 If elseif else
return false; } @Override public boolean doTransferAccount(String sAccountID, String tAccountID, float money) {
return false; } @Override public boolean doWithdrawFromAccount(String accountID, float money) {
State 模式的目标就是简化这类应用的代码,把依赖于状态的逻辑集中到一组类,每一 个类代表一种不同的状态,从而避免 if 语句嵌套过深或过于复杂,转而依赖于多态性来调 用不同的方法。
因为,如果对象的状态信息很关键,对象会拥有一些变量来指示如何根据状态做出相 应的动作。这些变量大量地散布于复杂的多层嵌套 if 语句中,来描述对象如何响应可能出 现的事件。用这种方式建立对象模型的最大缺点在于 if 语句可能变得相当复杂一旦要修改 对象的状态模型,往往有多个方法的许多 if 语句需要调整。 4、是否必须使用 State 模式的应用场合
在实际应用中,类似开关一样的状态切换是很多的,但有时并不是那么明显,取决于 你的经验和对系统的理解深度。
这里要阐述的是“开关切换状态”和“一般的状态判断”是有一些区别的,“一般的状 态判断”也是有 if---elseif 结构。

.netgof23种设计模式

.netgof23种设计模式

.netgof23种设计模式⼀、设计模式的分类GOF⼀共总结了23套设计模式,⼤致可以分为以下三类:创造型模式这些设计模式提供了⼀种在创建对象的同时隐藏创建逻辑的⽅式,⽽不是使⽤ new 运算符直接实例化对象。

这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活,该类型包括:单件模式、抽象⼯⼚、建造者模式、⼯⼚⽅法模式和原型模式等5种。

结构型模式这些设计模式关注类和对象的组合。

继承的概念被⽤来组合接⼝和定义组合对象获得新功能的⽅式,该类型包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式等7种。

⾏为型模式这些设计模式特别关注对象之间的通信。

分为职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板⽅法、访问者模式等11种。

⼆、设计模式解析常⽤设计模式浅析:1、单件模式结构图:意图:保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。

适⽤性:当类只能有⼀个实例⽽且客户可以从⼀个众所周知的访问点访问它时。

当这个唯⼀实例应该是通过⼦类化可扩展的,并且客户应该⽆需更改代码就能使⽤⼀个扩展的实例时。

⽰意性代码:1//单件模式⽰意性代码2public class Singleton3 {4//创建私有对象,保证只有⼀个对象5private static Singleton _instance;67//保护类型的构造函数,⼦类化可扩展8protected Singleton() { }910//提供公共访问点11public static Singleton Instance()12 {1314// 使⽤ 'Lazy initialization',为对象实例化15if (_instance == null)16 {17 _instance = new Singleton();18 }1920return _instance;21 }22 }Singleton特点总结:实例对外唯⼀、⼦类可以扩展并且提供⼀个公共的访问点访问。

设计模式系列之一:23种GoF设计模式概述

设计模式系列之一:23种GoF设计模式概述

设计模式系列之一:23种GoF设计模式概述23种GoF设计模式概述在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解。

后面的章节再进行详细介绍。

创建型模式关注于怎么创建对象的创建型模式,他们将对象的创建与使用相互分离,对象的使用者无需关心如何创建对象,只知道怎么使用就行,以降低耦合度。

犹如汽车使用人无需关注汽车是怎么造出来一样,只要知道怎么使用就行。

下面这5种模式就是属于这一类。

•单例(Singleton)模式:控制某个类只能自行生成一个可供外部全局访问的实例。

例如:Windows的窗口管理器或者任务管理器都是只有一个实例。

•原型(Prototype)模式:将一个创建成本高(如:装载大文件、初始化耗时长、CPU资源占用多等)的对象作为原型,通过对其进行复制或者克隆,来创建其他类似的新实例。

•抽象工厂(Abstract Factory)模式:由继承自抽象工厂类的具体工厂分别来创建有相同联系的多个不同产品。

例如不同的培训学校,可以创建课程和课程所用的教材。

•建造者(Builder)模式:针对一个复杂对象,它的构建需要很多步骤和部件,将这种对象拆解成多个相对简单的构成部件或者步骤,然后再根据需要分别构建他们,直到得到该复杂对象。

例如:快餐店的套餐,他的构造分别由汉堡、饮料、薯条构成,这就要求建造或制作者分别创建各种物品,然后返回一个完整的套餐给点餐人员。

•工厂方法(Factory Method)模式:由继承自抽象工厂类的具体工厂来决定生成什么具体产品。

例如都属于家具厂的沙发工厂、桌椅工厂和床厂分别生产沙发、桌椅和床这些家具。

结构型模式这种模式关注如何将对象和类按照某种方式一起来构成新的、更大、更有效果的低耦合结构,这种组成方式用于类结构的继承、和用于对象结构的组合或聚合。

具有组合或聚合关系的各对象之间要比继承关系的各对象之间的耦合度弱,这样对象结构要比类对象具有更低的耦合度。

跟我学GOF程序代码编程中的各种设计模式——构建者设计模式

跟我学GOF程序代码编程中的各种设计模式——构建者设计模式

杨教授大学堂,版权所有,盗版必究。
3/3 页
1/3 页
杨教授大学堂,版权所有,盗版必究。
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
//返回最后组装成品结果(返回最后装配好的汽车), 但成品的组装过程不在这里 进行,而是转移到下面的 Director 类中进行。从而实现了解耦过程和部件 Product getResult(); } (2)其次,用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一 个个部件(复杂对象是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装 成成品。 public class Director{ private Builder builder; public Director( Builder builder ){ this.builder = builder; } // 将部件 partA、partB 和 partC 最后组成复杂对象。这里是将车轮方向盘和发动机 组装成汽车的过程 public void construct(){ builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } (3)设计 Builder 的具体实现 ConcreteBuilder: 通过具体完成接口 Builder 来构建或装配产品的部件;定义并明确它所要创建的是什么 具体东西;提供一个可以重新获取产品的接口。 public class ConcreteBuilder implements Builder{ Part partA, partB, partC; public void buildPartA() { //这里是具体如何构建 partA 的代码 } public void buildPartB() { //这里是具体如何构建 partB 的代码

跟我学GOF程序代码编程中的各种设计模式——原型设计模式

跟我学GOF程序代码编程中的各种设计模式——原型设计模式
杨教授大学堂,版权所有,盗版必究。 2/3 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
} public static void main(String[] args) { PrototypeTest prototypetest = new PrototypeTest(); } } (4)执行后的结果
杨教授大 精心创作的优秀程序员 职业提升必读系列资料
} return oneObject; } public void addOneMail(String oneMailAddress){ this.mailList.add(oneMailAddress); } public ArrayList<String> getAllMail(){ return this.mailList; } } (2)子类 package com.px1987.prototype; public class Chinese extends Person { public Chinese() { } public void doPrintInfo() { System.out.println(getAllMail()); } } (3)测试类 package com.px1987.prototype; public class PrototypeTest { public PrototypeTest() { Chinese zhang=new Chinese(); zhang.addOneMail("trainict@"); zhang.doPrintInfo(); Chinese wang=(Chinese)zhang.clonePerson(); wang.addOneMail("webmaster@"); wang.doPrintInfo(); zhang.doPrintInfo();

设计模式之装饰模式(Decorator)详解及代码示例

设计模式之装饰模式(Decorator)详解及代码示例

设计模式之装饰模式(Decorator)详解及代码⽰例⼀、装饰模式的定义 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加⼀些职责(即增加其额外功能)的模式,它属于对象结构型模式。

⼆、装饰模式优缺点 装饰(Decorator)模式的主要优点有:采⽤装饰模式扩展对象的功能⽐采⽤继承⽅式更加灵活。

可以设计出多个不同的具体装饰类,创造出多个不同⾏为的组合。

其主要缺点是: 装饰模式增加了许多⼦类,如果过度使⽤会使程序变得很复杂。

三、装饰模式的实现 通常情况下,扩展⼀个类的功能会使⽤继承⽅式来实现。

但继承具有静态特征,耦合度⾼,并且随着扩展功能的增多,⼦类会很膨胀。

如果使⽤组合关系来创建⼀个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的⽬标。

下⾯来分析其基本结构和实现⽅法。

装饰模式主要包含以下⾓⾊。

抽象构件(Component)⾓⾊:定义⼀个抽象接⼝以规范准备接收附加责任的对象。

具体构件(Concrete Component)⾓⾊:实现抽象构件,通过装饰⾓⾊为其添加⼀些职责。

抽象装饰(Decorator)⾓⾊:继承抽象构件,并包含具体构件的实例,可以通过其⼦类扩展具体构件的功能。

具体装饰(ConcreteDecorator)⾓⾊:实现抽象装饰的相关⽅法,并给具体构件对象添加附加的责任。

装饰模式的结构图如图所⽰: 我们先来看看我们通过继承的⽅式新增特性这种实现⽅式,⽐如本例使⽤煎饼果⼦,代码如下:/*** 煎饼*/public class Battercake {protected String getDesc(){return "煎饼";}protected int cost(){return 8;}}/*** 加蛋的煎饼*/public class BattercakeWithEgg extends Battercake {@Overridepublic String getDesc() {return super.getDesc()+" 加⼀个鸡蛋";}@Overridepublic int cost() {return super.cost()+1;}}/*** 加蛋加⾹肠的煎饼*/public class BattercakeWithEggSausage extends BattercakeWithEgg {@Overridepublic String getDesc() {return super.getDesc()+ " 加⼀根⾹肠";}@Overridepublic int cost() {return super.cost()+2;}}public class Test {public static void main(String[] args) {Battercake battercake = new Battercake();System.out.println(battercake.getDesc()+" 销售价格:"+battercake.cost());Battercake battercakeWithEgg = new BattercakeWithEgg();System.out.println(battercakeWithEgg.getDesc()+" 销售价格:"+battercakeWithEgg.cost());Battercake battercakeWithEggSausage = new BattercakeWithEggSausage();System.out.println(battercakeWithEggSausage.getDesc()+" 销售价格:"+battercakeWithEggSausage.cost());}} 最后测试结果为:煎饼销售价格:8煎饼加⼀个鸡蛋销售价格:9煎饼加⼀个鸡蛋加⼀根⾹肠销售价格:11 虽然我们也实现了扩展类的功能,但是继承的⽅式耦合度⾼,并且如果新增会⽆限增加类,如果修改原有类,对后⾯的类影响很⼤,因此如果使⽤装饰模式,代码如下:public class DecoratorPattern{public static void main(String[] args){Component p=new ConcreteComponent();p.operation();System.out.println("---------------------------------");Component d=new ConcreteDecorator(p);d.operation();}}//抽象构件⾓⾊interface Component{public void operation();}//具体构件⾓⾊class ConcreteComponent implements Component{public ConcreteComponent(){System.out.println("创建具体构件⾓⾊");}public void operation(){System.out.println("调⽤具体构件⾓⾊的⽅法operation()");}}//抽象装饰⾓⾊class Decorator implements Component{private Component component;public Decorator(Component component){ponent=component;}public void operation(){component.operation();}}//具体装饰⾓⾊class ConcreteDecorator extends Decorator{public ConcreteDecorator(Component component){super(component);}public void operation(){super.operation();addedFunction();}public void addedFunction(){System.out.println("为具体构件⾓⾊增加额外的功能addedFunction()");}}四、装饰模式的应⽤场景 前⾯讲解了关于装饰模式的结构与特点,下⾯介绍其适⽤的应⽤场景,装饰模式通常在以下⼏种情况使⽤。

跟我学GOF程序代码编程中的各种设计模式——模板方法模式

跟我学GOF程序代码编程中的各种设计模式——模板方法模式

如果仅仅因为细节上的不同而要重写整个 SQL 语句的构件过程显然是不划算的,那么 采用什么方法可以复用构件过程呢?我们可以采用模板方法。 2、模板方法模式的基本思路 定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以不改变一 个算法的结构,即可重新定义该算法的某些特定步骤。这里需要复用的使算法的结构,也 就是步骤,而步骤的实现可以在子类中完成。 使用 Java 的抽象类时, 就经常会使用到 Template 模式。 因此 Template 模式使用很普遍, 而且很容易理解和使用。模板设计模式一般是一个抽象类,将部分逻辑以具体方法以及具 体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑; 不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。 3、模板方法模式是实现 OCP 的常用方法 使用 Template Method 模式是满足 OCP (The Open-Closed Principle 开放-封闭原则) 的 最常用方法。OCP 原则的基本思想是软件实体(类,模块,函数等等)应该是可以扩展的,
杨教授大学堂,版权所有,盗版必究。 1/2 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
但是不可修改的。 即对于扩展是开放的,模块的行为可以扩展,又要“对于更改是封闭的” , 不允许修改原有的代码。 实现 OCP,就应该采用面向接口编程,而不是面向对象编程。 4、模板方法模式的实现实例 在抽象类中定义模板方法的关键是:在一个非抽象方法中调用调用抽象方法,而这些 抽象方法在子类中具体实现。 public abstract class Benchmark{ public abstract void benchmark(); //希望在子类中完成的功能 public final void repeat (int count) { //自己已经实现的功能 benchmark(); } } public class MethodBenchmark extends Benchmark { public void benchmark() { //实现真正的功能的子类 } } Benchmark baseClass=new MethodBenchmark(); baseClass .repeat(10); 至于这样做的好处,很显然啊,扩展性强。以后 Benchmark 内容变化。我们只要再做 一个继承子类就可以,不必修改其他应用代码。 5、模板方法模式的使用场合 (1)一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成。 (2)各子类公共的行为应该被提取出来并集中到一个公共父类中以避免代码的重复。首先 识别现有代码的不同之处,并且把不同部分分离为新的操作,最后,用一个调用这些新的 操作的模板方法来替换这些不同的代码。 (3)控制子类的扩展。 //另一个子类 //使用其它由子类实现的功能 //该方法为 Template 方法

跟我学GOF程序代码编程中的各种设计模式——装饰(Decorator)模式

跟我学GOF程序代码编程中的各种设计模式——装饰(Decorator)模式

1.1跟我学GOF程序代码编程中的各种设计模式——装饰(Decorator)模式1.1.1装饰模式1、装饰模式概述(1)装饰模式是一种处理问题的方式需要说明的是,装饰模式是一种处理问题的方式,装饰模式不等于界面设计,这两个概念不要搞混了。

装饰这个概念好像一个油漆工,在原有的家具上刷上色(增加功能),而原有的家具可能是原来已经就有的旧家具,使用装饰模式就有可能增加它的生命周期。

(2)Decorator定义动态给一个对象添加一些额外的职责,就象在墙上刷油漆。

使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。

Decorator模式可以解决这个问题。

Decorator字面的意思是装饰的意思,在原有的基础上,每添加一个装饰,就可以增加一种功能。

2、意图----为什么使用Decorator模式?(1)常规的实现方式----使用继承来实现功能的拓展我们通常可以使用继承的方式来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必会生成很多子类,从而增加系统的复杂性;同时使用继承实现功能的拓展,那我们必须可预见这些拓展功能------因此,这些功能是编译时就确定了,当然也就是静态的。

(2)使用Decorator模式使用Decorator的理由是这些功能需要由用户动态决定加入的方式和时机,因此Decorator模式提供了一种“即插即用”的方法,在运行期间决定何时增加何种功能。

事实上,上面所要解决的意图可以归结为“在不改变对象的前提下,动态增加它的功能”,也就是说,我们不希望改变原有的类,或者采用创建子类的方式来增加功能,在这种情况下,可以采用装饰模式。

3、Decorator模式的程序结构装饰器结构的一个重要的特点是,它继承于一个抽象类,但它又使用这个抽象类的聚合(即装饰类对象可以包含抽象类对象)。

Decorator确实能够很好的缓解当功能组合过多时子类继承所能够带来的问题。

但是在得到很大的灵活性的同时,Decorator在使用时也表现得较为复杂。

盘点GoF的23种设计模式

盘点GoF的23种设计模式

盘点GoF的23种设计模式前⾔设计模式最初并⾮出于软件设计中,⽽是⽤于建筑领域的设计中。

1995年,四位作者将建筑设计的基本模式融合到软件开发中,合作出版了《设计模式:可复⽤的⾯向对象软件的基础》,⼀共收录了23个设计模式,这是设计模式领域⾥程碑的事件,导致了软件设计模式的突破。

所以这四位作者在软件开发领域耦以四⼈帮(Gang Of Four)匿名著称,简称GoF。

⼀、设计模式的分类设计模式按照⽬的来划分的话可以划分为三种类型,分别为创建型模式、结构型模式和⾏为型模式1.1、创建型模式⽤于描述“怎样创建对象”,主要特点是将对象的创建和使⽤进⾏分离。

对象使⽤者不需要关⼼对象的创建细节,可以降低创建对象和使⽤对象之间的耦合度。

主要有单例模式、原型模式、⼯⼚⽅法模式、抽象⼯⼚模式和建造者模式等五种设计模式1.2、结构型模式⽤于描述如何将类或对象按某种布局组成更⼤的结构主要有代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式等七种设计模式1.3、⾏为型模式⽤于描述类或对象之间怎样协作共同完成单个对象都⽆法单独完成的任务以及如何分配各个对象的职责分配主要有模版⽅法模式、策略模式、命令模式、责任链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式和解释器模式等⼗⼀中设计模式⼆、创建型设计模式2.1、单例模式(Singleton)定义:某个类只能⽣成⼀个实例,该类需要提供⼀个全局访问点供外部获取该类的全局唯⼀实例单例模式的类需要满⾜以下三个要求:1.单例类只有⼀个实例对象2.单例对象必须由单例类⾃⾏创建3.单例类需要对外提供⼀个获取单例对象的全局访问点优缺点:1、保证内存中仅有⼀个实例,减少内存开销2、不易扩展,需求发⽣改变需要修改单例类,会违背开闭原则应⽤场景:1、需要频繁创建和销毁某个类的实例时;2、某个类的实例具有唯⼀性时3、类的创建实例的过程⾮常消耗资源时4、对象需要被全局共享时可参考⽂章:2.2、原型模式(Prototype)定义:将⼀个对象作为原型,通过对其复制从⽽克隆出多个和原型类似的新的实例优缺点:1、采⽤clone的⽅式⽐new⼀个对象性能更好,因为是直接基于内存⼆进制流的复制2、深克隆时需要每⼀层的对象都需要实现cloneable接⼝原型模式在Java中的实现依赖于cloneable接⼝,原型实现cloneable接⼝,需要根据原型创建新对象时,直接调⽤原型对象的clone⽅法进⾏复制即可应⽤场景:1、对象之间相同或相似时,⽆需通过new创建2、创建对象成本⼤,⽐如⽐较消耗CPU或⽹络资源等3、系统中⼤量使⽤该类对象,且各个调⽤者都需要给它的属性重写赋值时,⽐如状态等属性案例如下:业务场景⽃地主游戏有3⼈⽃地主和4⼈⽃地主,每种模式还分为新⼿房和⾼⼿房,此时可以抽象出游戏房间的类,并初始化各种类型的房间原型,每当有玩家进⼊对应模式的房间时就通过原型直接复制出⼀个房间即可。

GOF23种设计模式详解-tony

GOF23种设计模式详解-tony

} public interface Driver{ Car driveCar();
第 5 / 89 页

1.1 设计模式之略见一斑(工厂模式Factory)
} public class QQDriver implements Driver{ public Car driveCar() { return new QQCar(); } } public class BaoMaDriver implements Driver{ public Car driveCar() { return new BaoMaCar(); } } public class BenChiDriver implements Driver{ public Car driveCar() { return new BenChiCar(); } }
- 做最棒的软件开发交流社区
21种设计模式详解
作者: 行者买刀
行者买刀的博客文章精选 如有疑问或建议请站内短信联系
第 1 / 89 页
本书由JavaEye提供的电子书DIY功能自动生成于 2010-02-26
1.2 设计模式之略见一斑(单例模式singleton)
发表时间: 2010-02-01 单例模式是属于比较常用的一例,一个类(class)在内存中只有一个实例。 常用方式如下: 第一种(饿汉式):
public class Singleton {

1.1 设计模式之略见一斑(工厂模式Factory)
如此基础上对新式的各种各样的车进行区别,从而当新增一款车型时或者新增一类车型时就对应加入相应的类 和方法
第(单例模式singleton)

目录
1. J2SE
1.1 设计模式之略见一斑(工厂模式Factory) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 设计模式之略见一斑(单例模式singleton) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3 设计模式之略见一斑(建造模式builder) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.4 设计模式之略见一斑(原型模式Prototype) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.5 设计模式之略见一斑(适配器模式Adapter) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.6 设计模式之略见一斑(桥梁模式bridge) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.7 设计模式之略见一斑(外观模式Facade) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.8 设计模式之略见一斑(组合模式Composite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.9 设计模式之略见一斑(装饰模式decorator) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 1.10 设计模式之略见一斑(代理模式Proxy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 1.11 设计模式之略见一斑(享元模式flyweight) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 1.12 设计模式之略见一斑(命令模式Command) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.13 设计模式之略见一斑(解释器模式Interpreter) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 1.14 设计模式之略见一斑(状态模式State) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 1.15 设计模式之略见一斑(策略模式strategy) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 1.16 设计模式之略见一斑(Template Method模板方法模式) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 1.17 设计模式之略见一斑(Memento备忘录模式) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 1.18 设计模式之略见一斑(Observer观察者模式) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 1.19 设计模式之略见一斑(Chain of Responsibility责任链模式) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Go语言常见设计模式

Go语言常见设计模式

Go语言常见设计模式Go语言是一种开源编程语言,被广泛应用于并发编程和网络编程。

在Go语言中,设计模式是一种经过验证的软件设计解决方案,可以帮助我们解决常见的编程问题。

本文将介绍Go语言常见的设计模式,并探讨它们的使用场景和实现方法。

一、单例模式单例模式是一种保证一个类只有一个实例的设计模式。

在Go语言中,可以通过懒汉式和饿汉式两种方式来实现单例模式。

懒汉式是在第一次使用时创建实例,而饿汉式则在程序启动时即创建实例。

根据实际需求和性能要求,我们可以选择合适的方式来实现单例模式。

二、工厂模式工厂模式是一种将对象的创建和使用分离的设计模式。

在Go语言中,可以通过简单工厂模式、工厂方法模式和抽象工厂模式来实现对象的创建和使用解耦。

简单工厂模式使用一个工厂类来创建对象,工厂方法模式使用子类来决定创建哪个对象,抽象工厂模式使用接口来创建一组相关的对象。

三、装饰器模式装饰器模式是一种动态地给对象添加附加职责的设计模式。

在Go语言中,可以通过函数包装和方法继承两种方式来实现装饰器模式。

函数包装通过将函数作为参数传递给其他函数,并在调用时添加额外的逻辑。

方法继承通过嵌入结构体来实现对方法的增强。

四、观察者模式观察者模式是一种定义对象之间一对多依赖关系的设计模式。

在Go语言中,可以通过使用接口和回调函数的方式来实现观察者模式。

接口定义观察者对象需要实现的方法,回调函数作为观察者对象与被观察对象之间的通信方式。

五、策略模式策略模式是一种根据不同的场景选择不同的算法来解决问题的设计模式。

在Go语言中,可以通过使用函数类型和接口来实现策略模式。

函数类型作为策略的抽象,接口作为具体策略的实现。

六、适配器模式适配器模式是一种将不兼容的接口转换为兼容的接口的设计模式。

在Go语言中,可以通过使用接口和结构体组合的方式来实现适配器模式。

接口定义兼容的方法,结构体对不兼容的接口进行封装和转换。

七、模板方法模式模板方法模式是一种定义算法框架,而将具体的实现细节延迟到子类中的设计模式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前言软件开发工作从本质上属于创造性的工作,它是一种将“软件产品”从无到有生的创建过程。

行业内流行的“站在巨人的肩膀上”、“不要重复地发明轮子”、“不要不断地重复自己”等“名言警句”其实都是对“软件复用”思想的具体体现。

面向对象程序设计方法提供了类级别的重用;而基于“组件化”的复用方式,已使软件系统产品在质量保证、开发效率等方面得到了更大的提高;面向框架级的系统集成开发(如J2EE中的SSH、、PHP的LAMP等),不仅可以实现组件级别的重用,而且在系统的总体架构、软件设计思想等方面都可以得到重用。

因此“面向对象”、“组件化”、“基于XML的数据结构描述”、“面向框架”等设计思想和实现技术,更使得软件系统的“复用”达到了一个更深的层次,随之而来的各种企业级“中间件组件”、AOP、SOA等技术的出现,也使得开发者的主要精力可以越来越多地关注于应用系统的业务逻辑和业务数据,而非系统“底层”的具体实现技术和各个不同技术平台之间、各个数据库系统之间的差异。

作者接触很多高校计算机软件专业类的教师和学生,深感目前的计算机软件开发类专业的程序设计类各个课程在教学方面的欠缺,不仅编码不规范(胡写代码和混乱命名)、技术深度不足(学C语言不学习指针、学Java不学习集合、反射和范型),而且程序代码还存在许多不可靠、性能低下、扩展性差等方面的问题;国内许多“小作坊”型的软件公司人员不断地生产出大量的“垃圾代码”,从而使得这些软件公司的项目都是“一次性买卖”,客户方受骗后再也没有第二次的项目开发。

作者根据自身多年的软件开发实践和经验总结,结合多年的IT职业培训的教学和高校软件学院一线的教学工作体验,在本系列文档中通过具体的程序代码示例为读者介绍GOF 设计模式及相关的应用技术。

主要的目的是希望能够以成功的经验或者失败的教训为读者减少软件开发失败的风险,同时也为高校师生总结出如何能够编程开发出一个“易读的”、“易维护的”、“易扩展”、“高性能”和“可重用”的系统程序。

本文档主要涉及GOF装饰器模式及应用、装饰器模式的程序结构和如何利用装饰器模式重构业务功能类的应用示例、如何利用装饰器模式模拟实现AOP拦截器应用示例等方面的内容。

杨教授大学堂精心创作有系列化的优秀程序员职业提升必读技术资料,这些资料将系统地从软件设计和开发实现的“设计思想”、“管理策略”、“技术实现”和“经验方法”等方面与读者进行充分的交流,涉及作者对软件开发设计思想和原则、课程设计、项目实训、软件实现技术等方面的学习心得体会和应用技巧、经验总结。

本文目录1.1GOF装饰器模式及应用 (3)1.1.1GOF装饰器模式 (3)1.1.2装饰器模式的程序结构 (6)1.2利用装饰器模式重构业务功能类 (12)1.2.1实现装饰器模式中的业务功能类 (12)1.2.2实现装饰器模式中的装饰组件功能类 (17)1.2.3测试本示例的应用效果 (23)1.3利用装饰器模式模拟实现AOP拦截器应用示例 (28)1.3.1构建被装饰的应用功能类程序 (28)1.3.2构建装饰器组件功能类程序 (31)1.3.3测试本示例的应用效果 (38)1.1GOF装饰器模式及应用1.1.1GOF装饰器模式1、装饰器模式(Decorator)(1)装饰器模式是一种处理问题的方式——应用对象组合替代对象继承装饰器设计模式同样也和GOF桥模式一样,都是采用对象组合的设计方案取代对象继承的设计方案(因为继承会产生紧藕合——形成“遗传”关系,而组合能够产生“堆积门”的效果——形成“拼装”或者“装配”关系。

从而能够更好地适应软件系统需求可变性和提高相关的程序代码的灵活性,装饰器设计模式在GOF设计模式的分类中属于结构型的模式。

(2)装饰器模式通过添加新的装饰组件以适应需求的变化“装饰”这个概念好像如一个油漆工,可以在原有的家具(代表原有的软件应用系统)上刷上新的颜色(也就是需要对软件系统增加的新功能),而家具可能是原来就已经存在的旧家具;旧家具经过这样的“翻新”,可以再次被应用,相应地也就延续了家具的使用寿命,降低了设备投入的成本——而软件系统也是可以“翻新”的!2、如何实现对软件系统的功能扩展以适应系统的需求变化(1)软件系统的需求变化是永恒的对软件系统的开发人员来说,软件系统的需求变化是永恒的,为了使得所开发实现出的软件系统能够继续地发挥相关的作用而避免被弃之无用。

则必须要对软件系统进行改造以满足新的要求,但如何改造软件系统?(2)修改原有相同的源代码对软件系统的功能扩展或者完善原有的功能,最直接的实现思路是直接修改原有系统的源程序代码——但这违背了OO所倡导的“开闭”原则!因此,不能在对象内部进行改造而必须要在对象之外对原有的程序对象进行功能扩展。

如何实现?可以应用“对象继承”和“对象组合”两种手段。

(3)装饰器模式通过对象组合进行系统功能的扩展通过使用装饰模式就有可能增加系统的功能,但对原有的系统本身则不需要大量地修改,同时也使得系统能够继续被应用以适应系统的需求变化和延长软件系统的生命期。

因此,装饰器模式能够很好地满足OO所倡导的“开闭”原则。

3、装饰器模式产生的应用背景(1)装饰器模式也称为包裹模式(Wrapper)在软件应用系统开发中,开发人员希望实现系统的一个基本的核心功能代码模块以快速地构造出软件系统的原型,而在该软件系统的使用过程中根据应用的具体需要随时动态地由外围的特定功能代码实现专用功能的包装以满足应用的需要。

之所以要采用如此的开发实现方式,主要的目的是降低软件系统开发的成本和满足多变的应用需求。

但如何满足这样的功能要求?常规的设计方案一般是使用继承——比如,模板方法模式则是采用继承的设计实现方案。

(2)继承的设计实现方案有可能产生出大量的子类因为如果这些需要拓展的功能的种类很繁多,那么势必会生成很多的子类,从而增加了系统的复杂性;同时使用继承的设计方案达到实现软件系统功能的拓展,那必须要可预见这些拓展功能应该有哪些。

因此,应用继承的设计实现方案将导致这些功能是编译时就需要确定的——也就是在设计和实现时就要确定,而不能在使用阶段动态选择和改变,当然也就是静态地进行系统功能的扩展。

(3)如何能够实现动态地扩展之所以需要提供动态地扩展软件系统的功能,也就是软件系统的功能模块的程序代码在运行过程中,根据客户当前的应用需要,动态地选择某个功能的扩展组件。

4、装饰器模式能够更好地适应需求的变化(1)如何更好地适应需求的变化为了能够减少由于继承所带来的父子之间关系的耦合性,也可以使用装饰器模式——它用对象组合取代对象继承,从而保证扩展部分的功能实现代码与软件系统中原有部分的功能代码能够松散藕合。

(2)装饰器模式可以产生“随需而变”的应用效果使用装饰器模式除了可以采用“对象组合”的形式进行系统的功能扩展以外,还由于这些功能的需要与否是可以由客户端程序的使用者(用户或者客户)动态地决定加入的“方式”和“时机”——因此,可以达到“定制性”的应用效果。

因此装饰模式提供了一种“即插即用”的方法,在运行期间决定“何时”增加“何种”的功能。

(3)装饰器模式提高了组件的可扩展性和可重用性在应用开发中,可以给一个被装饰的对象增加多个不同的装饰器组件,从而满足可扩展性的要求;当然,也可以用一个装饰器组件装饰不同的被装饰对象,从而复用这个装饰器组件的功能。

5、应用装饰器模式的主要目的由于可以实现在不改变原有系统类的程序代码的前提下,动态地为它增加新的功能。

因此,该模式更适合应用于软件系统的维护扩展和升级中——适配器模式也能够达到如此的应用目的。

(1)不希望抛弃原有的软件系统,但又要对其进行功能扩展的应用要求降低软件系统的成本不仅体现在软件系统开发实现阶段中低成本地开发实现,同时也表现在软件系统的使用过程中——延续软件系统的使用生命期,也就提高了软件系统的使用价值,相应地也就降低了软件系统的投入成本。

因此,在企业信息化的过程中,不能采用“抛弃”的思路,而应该要采用“改造”方式以最低的成本取得最佳的经济效益。

(2)在扩展过程中不希望通过改变原有的程序类的代码或者也不希望采用创建子类的方式来增加新功能以适应系统的变化OO所倡导的“开闭”原则为软件系统的开发人员指明了如何进行软件系统的升级维护和改造完善,但如何能够遵守“开闭”原则?为此,GOF设计模式中的装饰器模式为软件系统的开发人员提供了相关的解决方案。

装饰器模式能够在原有软件系统的程序代码不变的基础上,通过每添加一个新的“装饰”组件,就相当于为软件系统增加一种新的扩展功能。

(3)快速构建出系统的核心组件装饰器模式使得软件系统的模块设计人员在进行功能设计时,不需要把所有的功能都预先设计定义出来、并加以具体的功能实现。

而只需要定义出最基本的或者核心的功能,可以在具体使用时根据应用的需要再组合相应的装饰器组件以达到功能的扩展。

这样的开发实现方式,不仅能够大大地降低企业在软件系统开发实现方面的成本,而且也能够降低企业的经济投入的风险。

6、在应用装饰器模式时所应该要注意的问题(1)装饰器模式确实能够很好地缓解当功能组合过多时采用子类的继承方式所可能带来的大量子类的问题。

装饰器模式之所以能够达到这样的应用效果,主要是由于它采用对象组合替代对象继承而实现装饰器模式。

(2)装饰器模式也存在明显的不足开发人员在得到很大的灵活性的同时,装饰模式在具体使用时其一表现在代码实现方面较为复杂;其二,主要由于在理论上可以用无数个装饰者来包装一个组件,过多的装饰者类会导致在系统设计中出现许多“小对象”或者“小部件”;最后,过度地使用装饰器模式,会让软件系统的程序变的比较复杂。

(3)设计模式存在两面性,读者必须要合理地应用模式在许多应用场合下,开发人员必须要在“鱼”和“熊掌”之间合理地进行选择。

主要是由于装饰器模式是把一系列复杂的功能分散到每个装饰器组件对象中去实现——“分而治之”。

(4)合理地分配装饰器模式中的装饰器组件的功能为了提高各个装饰器组件的可重用性,不应该设计构建出“复合功能”的装饰器组件。

一般都是将一个装饰器组件只实现一个特定的扩展功能。

但这样的设计策略的结果,将会产生出很多细粒度的类对象实例。

而且随着软件系统的可扩展的功能越复杂,所需要的细粒度装饰器组件对象也就越多,这为管理这些装饰器组件也带来一定的工作量。

7、装饰器模式可以灵活多样地组合各个装饰类的对象实例通过使用不同的具体装饰类以及将这些装饰类采用各种不同形式的排列和组合,最终使得软件系统的模块设计师可以创造出很多不同行为的组合结果。

因此,装饰器模式可以灵活多样地组合各个装饰类的对象实例,从而不仅能够更好地满足软件系统的可变性的功能要求,也能够为开发人员和软件系统的使用者带来一定的灵活性。

相关文档
最新文档