java实现装饰器模式(Decorator Pattern)

一、什么是装饰器模式

  装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

  这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

  在不想增加更多子类的情况下扩展类,动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

二、装饰器模式的具体实现

1、结构图

2、分析

装饰器模式由组件和装饰者组成。

  • 抽象组件(Component):需要装饰的抽象对象。
  • 具体组件(ConcreteComponent):是我们需要装饰的对象。
  • 抽象装饰类(Decorator):内含指向抽象组件的引用及装饰者共有的方法。
  • 具体装饰类(ConcreteDecorator):被装饰的对象。

3、java 代码实现:

抽象组件:

package com.designpattern.decoratorPattern;

/**
 * Component 组件 抽象角色
 * @author zhongtao on 2018/10/23
 */
public interface House {
 /**
  * 装饰风格
  */
 void style();
}

具体组件:

/**
 * 具体组件
 * @author zhongtao on 2018/10/23
 */
public class ChineseStyle implements House {
 @Override
 public void style() {
  System.out.println("中式风格装修");
 }
}

/**
 * 具体组件
 * @author zhongtao on 2018/10/23
 */
public class EuropeanStyle implements House {
 @Override
 public void style() {
  System.out.println("欧式风格装修");
 }
}

抽象装饰类:

package com.designpattern.decoratorPattern;

/**
 * 抽象装饰类
 *
 * @author zhongtao on 2018/10/23
 */
public class HouseDecorator implements House {

 public House house;

 public HouseDecorator(House house) {
  this.house = house;
 }

 @Override
 public void style() {
  house.style();
 }
}

具体装饰类:

package com.designpattern.decoratorPattern;

/**
 * 具体装饰类
 *
 * @author zhongtao on 2018/10/23
 */
public class RedDecorator extends HouseDecorator {

 public RedDecorator(House house) {
  super(house);
 }

 public void style() {
  this.house.style();
  System.out.println("红色装饰墙");
 }
}

测试装饰器模式:

package com.designpattern.decoratorPattern;

import org.junit.Test;

/**
 * 测试装饰器模型
 *
 * @author zhongtao on 2018/10/22
 */
public class DecoratorPatternTest {
 /**
  * 测试装饰器模型
  */
 @Test
 public void testDecoratorPattern(){
  ChineseStyle chineseStyle = new ChineseStyle();
  House redChineseStyle = new RedDecorator(new ChineseStyle());
  House redEuropeanStyle = new RedDecorator(new EuropeanStyle());

  System.out.println("中式装修");
  chineseStyle.style();

  System.out.println("\n中式加红色墙");
  redChineseStyle.style();

  System.out.println("\n欧式加红色墙");
  redEuropeanStyle.style();

 }
}

测试结果:

---中式装修---
中式风格装修

---中式加红色墙---
中式风格装修
红色装饰墙

---欧式加红色墙---
欧式风格装修
红色装饰墙

三、装饰器的优缺点

1、优点

  • 装饰类和被装饰类可以独立发展,不会相互耦合。
  • 装饰器模式是继承的一个替代模式。
  • 装饰器模式可以动态扩展一个实现类的功能。

2、缺点

多层装饰比较复杂。

源码地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java设计模式之装饰器模式(Decorator)

    概述 装饰模式是对客户端以透明的方式扩展对象的功能,是继承关系的一个替代方案.也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不用创造更多子类的情况下,将对象的功能加以扩展,装饰模式的关键在于这种扩展是完全透明的. 模式的结构 UML类图: 装饰模式中的类角色: 抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象 具体构件角色(Employe):定义一个将要接收附加责任的类 装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接

  • 浅谈Java设计模式系列-装饰器模式

    一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是单方,和代理模式相同,而且目标必须是抽象的. 而实际上,装饰器模式和代理模式的实现方式基本一致,只在目标的存在上有些差别,这个后面我们具体讲述. 二.初步分析 上面提到了两点: 涉及的是单方 目标是抽象的 我们来想一下,所谓单方主要指的是在整个装饰器模式中不存在双方调用,要解决的也不是双方调用的问题,而是解决单方提供对外服务的问题,这个单方在自行对外提供服务时,功能不足,或

  • C#装饰器模式(Decorator Pattern)实例教程

    本文以实例形式详细讲述了C#装饰器模式的实现方法.分享给大家供大家参考.具体实现方法如下: 现假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格.最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格. 每个产品都有名称和价格,首先设计一个关于产品的抽象基类. public abstract class ProductBase { public abstract string GetName(); public abstract double GetP

  • PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    本文实例讲述了PHP设计模式:装饰器模式Decorator.分享给大家供大家参考,具体如下: 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类-这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的

  • java实现装饰器模式(Decorator Pattern)

    一.什么是装饰器模式   装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.   这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能.   在不想增加更多子类的情况下扩展类,动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 二.装饰器模式的具体实现 1.结构图 2.分析 装饰器模式由组件和装饰者组成. 抽

  • 学习php设计模式 php实现装饰器模式(decorator)

    动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活[GOF95] 装饰模式是以对客户透明的方式动态地给一个对象附加上更多的职责.这也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. 一.装饰模式结构图 二.装饰模式中主要角色 抽象构件(Component)角色:定义一个对象接口,以规范准备接收附加职责的对象,从而可以给这些对象动态地添加职责. 具体构件(Concrete Compo

  • Java结构性设计模式中的装饰器模式介绍使用

    目录 装饰器模式 概述 实现原理 主要角色 应用场景 优缺点 装饰器模式的基本使用 创建抽象组件 具体组件 抽象装饰器 具体装饰器 客户端调用 装饰器模式 概述 装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),属于结构型模式. 它是指在不改变原有对象的基础之上,允许向一个现有的对象添加新的功能,同时又不改变其结构,作为现有的类的一个包装. 这种模式创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 提供了比继承

  • java设计模式-装饰者模式详解

    目录 引例 一般解法 装饰者模式 装饰者解法 代码: 抽象类 装饰者 被装饰者 客户端测试 总结: 引例 需求:设现在有单品咖啡:Espresso(意大利浓咖啡)和LongBlack(美式咖啡),调料有Milk(牛奶)和sugar(糖),客户可以点单品咖啡或单品咖啡+调料的组合,计算相应费用.要求在扩展新的咖啡种类时,具有良好的扩展性.改动维护方便. 抛砖引玉,我们先看看两种一般解法. 一般解法 方案一. 枚举创建每一种组合可能,Drink抽象类表示饮料,cost()方法计算价格,子类如Long

  • PHP设计模式之装饰器模式定义与用法详解

    本文实例讲述了PHP设计模式之装饰器模式定义与用法.分享给大家供大家参考,具体如下: 什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰". 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好的合作. 装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这

  • 详解Java如何优雅的使用装饰器模式

    目录 什么是装饰器模式 优点 缺点 使用场景 装饰器模式和代理模式的区别 装饰器的简单实现 装饰器模式实战 小结 什么是装饰器模式 装饰器模式(Decorator Pattern): 在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责: 感觉和继承如出一辙,不改变父类,子类可拓展功能: 优点 装饰类和被装饰类可以独立发展,不会相互耦合 相比于继承,更加的轻便.灵活 可以动态扩展一个实现类的功能,不必修改原本代码 缺点 会产生很多的装饰类,增加了系统的复杂性. 这种比继承更加灵活机动的特

  • Java设计模式之装饰器模式

    本文由老王将建好的书房计划请小王来帮忙,小王却想谋权篡位,老王通过教育他引出装饰器设计模式,第二部分针对老王提出的建设性意见实现装饰器模式,第三部分针对装饰器模式在Jdk中的IO.Spring中的缓存管理器.Mybatis的运用来加强我们的理解,第四部分说明装饰器模式和代理模式的区别及他们各自的应用场景. 读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云,本地源码下载. 一.引出问题 上篇文章(Java设计模式之组合模式)对老王的书架改造以后,老王是相当的满意,看小王能力突出,

  • 分析Python中设计模式之Decorator装饰器模式的要点

    先给出一个四人团对Decorator mode的定义:动态地给一个对象添加一些额外的职责. 再来说说这个模式的好处:认证,权限检查,记日志,检查参数,加锁,等等等等,这些功能和系统业务无关,但又是系统所必须的,说的更明白一点,就是面向方面的编程(AOP). 在Python中Decorator mode可以按照像其它编程语言如C++, Java等的样子来实现,但是Python在应用装饰概念方面的能力上远不止于此,Python提供了一个语法和一个编程特性来加强这方面的功能.Python提供的语法就是

随机推荐