文档章节

结构型模式之四:装饰器模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:43
字数 601
阅读 15
收藏 0
点赞 0
评论 0

装饰器模式动态的给两个存在的对象增加了新属性。在此文中,我会使用一个简单的例子——装饰你的女朋友——来说明装饰器怎么工作 的。

1、装饰器的故事

让我们假设你在寻找一个女朋友,这里有很多女孩来自不同的国家,如美国、中国、日本、法国等等。他们可能有不同的个性与习惯。在一个约会网站如eharmony.com, 如果每个女孩是一个独特的Java类,这可能有数千个类,这一系列的问题被称为类爆炸,这个类是不可扩展的,每当有一个新女孩,这需要一个新类被创造。 让我们修改设计,让每个习惯与个性变成一个装饰器,那样我们就能动态的实现女孩。

2、类图

 

Girl是一个位于顶层的抽象类,我们有不同的好姑娘来看不同的国家,通过GirlDecorator类,我们能添加新装饰器来给女孩装饰不同的特性。

3、装饰器模式的Java代码

Girl.java

public abstract class Girl {
  String description = "no particular";

  public String getDescription(){
    return description;
  }
}

AmericanGirl.java

public class AmericanGirl extends Girl {
  public AmericanGirl(){
    description = "+American";
  }
}

EuropeanGirl.java

public class EuropeanGirl extends Girl {
  public EuropeanGirl() {
    description = "+European";
  }
}

GirlDecorator.java

public abstract class GirlDecorator extends Girl {
  public abstract String getDescription();
}

Science.java

public class Science extends GirlDecorator {
  private Girl girl;
 
  public Science(Girl g) {
    girl = g;
  }
 
  @Override
  public String getDescription() {
    return girl.getDescription() + "+Like Science";
  }
 
  public void caltulateStuff() {
    System.out.println("scientific calculation!");
  }
}

我们能没有限制地添加一个方法如“Dance()”给每个装饰器。 Art.java

public class Art extends GirlDecorator {
 
  private Girl girl;
 
  public Art(Girl g) {
    girl = g;
  }
 
  @Override
  public String getDescription() {
    return girl.getDescription() + "+Like Art";
  }
 
  public void draw() {
    System.out.println("draw pictures!");
  }
}

Main.java

package designpatterns.decorator;
 
public class Main {
 
  public static void main(String[] args) {
    Girl g1 = new AmericanGirl();
    System.out.println(g1.getDescription());
 
    Science g2 = new Science(g1);
    System.out.println(g2.getDescription());
 
    Art g3 = new Art(g2);
    System.out.println(g3.getDescription());
  }
}

输出:

+American
+American+Like Science
+American+Like Science+Like Art

我们可以这样使用: 装饰器模式在Java标准库中 一个典型的装饰器模式是Java的IO类。 这里有一个简单的实现,BufferedReader装饰InputStreamReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
//System.in is an InputStream object

InputStreamReader : 桥接字节流与字符流。

InputStreamReader读取字节并使用特定的编码把他们转换成字符 

 BufferedReader : 从字符流中读取文本,按照顺序缓存字符,并提供一个高效的读取方法。 

以上文章翻译自: http://www.programcreek.com/2012/05/java-design-pattern-decorator-decorate-your-girlfriend/

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

【软考学习】设计模式——解释器模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 解释器设计模式总结: 一、定义:给定一个语言,定义它的文法的一种表示,并定...

yym15732626210 ⋅ 01/31 ⋅ 0

【软考学习】设计模式——状态模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 状态设计模式总结: 一、定义:当一个对象的内在状态改变时允许改变其行为,这...

yym15732626210 ⋅ 01/31 ⋅ 0

【软考学习】设计模式——访问者模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 访问者设计模式总结: 一、定义:表示一个作用于某对象结构中的各元素的操作。...

yym15732626210 ⋅ 01/31 ⋅ 0

【软考学习】设计模式——中介者模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 中介者设计模式总结: 一、定义:用于一个中介对象来封装一系列的对象交互。中...

yym15732626210 ⋅ 01/31 ⋅ 0

设计模式分类与原则

创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(...

晨猫 ⋅ 03/12 ⋅ 0

【软考学习】设计模式——观察者模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 观察者设计模式总结: 一、定义:定义了一种一对多的依赖关系,让多个观察者对...

yym15732626210 ⋅ 01/31 ⋅ 0

Java经典设计模式基础

一、概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理...

Idea ⋅ 01/20 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

设计模式之修饰器模式详解(附源代码)

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

thorhill ⋅ 03/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部