结构型模式之四:装饰器模式
结构型模式之四:装饰器模式
刀狂剑痴 发表于2年前
结构型模式之四:装饰器模式
  • 发表于 2年前
  • 阅读 15
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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

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
博文 111
码字总数 82582
×
刀狂剑痴
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: