文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:43
字数 601
阅读 16
收藏 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/

© 著作权归作者所有

奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
加载中

评论(0)

设计模式实例剖析与深入解读视频教程

├─创建型模式 │ ├─单例模式.pptx │ ├─原型模式.pptx% a, F7 |: k+ T" U, m0 m4 # k& w0 P; K% l6 N │ ├─状态模式.ppt( g) a8 J5 x5 O3 Q1 K# ~' h% w │ ├─策略模式.ppt3 B9 l3......

osc_vwtuqll7
2019/04/12
3
0
23种设计模式,每天一种设计模式(2)

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

osc_s6l7mhns
2018/01/11
22
0
北风设计模式课程---创建模式、结构模式、行为模式的区别

北风设计模式课程---创建模式、结构模式、行为模式的区别 一、总结 一句话总结: 创建模式:【关注对象的创建】:创建型模式,就是创建对象的模式,抽象了实例化的过程。 结构模式:结构型模...

osc_tartz9st
2019/06/16
5
0
设计模式 Vs实践-1 工厂模式

前言:设计模式在实际项目开发中应用的比较多(可能大部分人都用到了,但是并不知道属于哪种设计模式),一般都是先实现个小功能,然后看需求进行重构 本系列笔记主要把所有设计模式示例代码...

zhaogaojian
03/14
0
0
Java设计模式之四适配器模式和桥接模式

前言 在上一篇中我们学习了创建型模式的建造者模式和原型模式。本篇则来学习下结构型模式的适配器模式和桥接模式。 适配器模式 简介 适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的...

xiaoshen666
03/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

史上最全的“文件或目录损坏且无法读取”的解决办法大集合

问题描述: G盘打不开文件或目录损坏且无法读取,是因为这个I盘的文件系统内部结构损坏导致的。史上最全的“文件或目录损坏且无法读取”的解决办法大集合具体的恢复方法看正文 工具/软件:极...

计算无敌
今天
9
0
2048游戏的最佳算法是什么? - What is the optimal algorithm for the game 2048?

问题: I have recently stumbled upon the game 2048 . 我最近偶然发现了2048游戏。 You merge similar tiles by moving them in any of the four directions to make "bigger" tiles. 您可......

javail
今天
9
0
Spring Cloud Ribbon 客户端负载均衡

Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等,内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略: 简单轮询负载均衡 加权轮询负载均衡 区域...

泥瓦匠BYSocket
今天
7
0
为什么在Python 3中“范围(1000000000000000(1000000000000001))”这么快?

问题: It is my understanding that the range() function, which is actually an object type in Python 3 , generates its contents on the fly, similar to a generator. 据我了解, ra......

技术盛宴
今天
9
0
OSChina 周四乱弹 —— 卖全家桶!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :陈慧娴的单曲《与泪抱拥》 陈慧娴的嗓音加上向雪怀的词,这样的经典组合真不多。#今日歌曲推荐# 《与泪抱拥》- 陈慧娴 手机党少年...

小小编辑
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部