文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:43
字数 601
阅读 15
收藏 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
昌平
程序员
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
设计模式梳理(一)

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

lxq_xsyu
2017/11/02
0
0
【软考学习】设计模式——解释器模式

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

yym15732626210
01/31
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

arts-week5

Algorithm 824. Goat Latin - LeetCode 152. Maximum Product Subarray - LeetCode 110. Balanced Binary Tree - LeetCode 67. Two Sum II - Input array is sorted - LeetCode 665. Non-dec......

yysue
26分钟前
0
0
iOS开发之AddressBook框架详解

iOS开发之AddressBook框架详解 一、写在前面 首先,AddressBook框架是一个已经过时的框架,iOS9之后官方提供了Contacts框架来进行用户通讯录相关操作。尽管如此,AddressBook框架依然是一个非...

珲少
56分钟前
1
0
两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot...

Java填坑之路
今天
4
0
《Spring5学习》04 - 面向切面编程

一、Spring面向切面编程的基本概念 面向切面编程(即AOP):把项目中需要再多处使用的功能比如日志、安全和事务等集中到一个类中处理,而不用在每个需要用到该功能的地方显式调用。 横切关注...

老韭菜
今天
2
0
day61-20180819-流利阅读笔记

跑道没了,它们还在跑:澳门赛狗业的遗孤 Daniel 2018-08-19 1.今日导读 相信你早就知道香港有个赛马会,可是你听说过香港的邻居澳门原本有个赛狗会吗?其实,对于澳门人来说,赛狗这项活动历...

aibinxiao
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部