装饰模式(Decorator Pattern)

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。(来自百度百科)

 

假设有汉堡香辣鸡腿堡,黑椒牛柳堡,它仅有两块面包和一块肉,如果想给这个汉堡加料,比如生菜、辣椒、醋。这个时候可以使用装饰模式。

 

1,定义汉堡接口

pubilc interface Hambergur{
  String getName();
  abstract double getPrice();
}

2,被装饰者:香辣鸡腿堡

//被装饰者:香辣鸡腿堡 
public class 香辣鸡腿堡 implements Hambergur{
    public String getName(){
        return "香辣鸡腿堡";
    }
    public double getPrice(){
        return 12.80;
    }
}

 

 3,被装饰者:黑椒牛柳堡

public class 黑椒牛柳堡 implements Hambergur{
public String getName(){
return "黑椒牛柳堡";
}
public double getPrice(){
return 15.80;
}
}

 

 4,装饰者:加辣椒

public class 加辣椒 implements Hambergur{
private Hambergur hambergur;

public 加辣椒(Hambergur  hambergur ){
this.hambergur = hambergur;
}
public String getName(){
return hambergur.getName()+"加辣椒";
}
public double getPrice(){
return  hambergur.getPrice()+1;
}
}

 5,装饰者:加生菜

public class 加生菜 implements Hambergur{
private Hambergur hambergur;

public 加生菜(Hambergur  hambergur ){
this.hambergur = hambergur;
}
public String getName(){
return hambergur.getName()+"加点生菜";
}
public double getPrice(){
return  hambergur.getPrice()+2;
}
}

 

 

6,主程序:买汉堡

public static void main(String[] args){
  Hambergur hambergur = new 加辣椒(new 加生菜(new 香辣鸡腿堡()));
  //省略控制台输出语句
  hambergur.getName();
  hambergur.getPrice();
}

 

7,测试结果

  香辣鸡腿堡加生菜加辣椒

  15.80

 

--- 扩展:IO流中的装饰者模式 ---

 上面这图来自《head first 设计模式》,最顶层的是InputStream,它是一个抽象类,具有4个实现类,图中标注的FilterInputStream是一个抽象装饰者(其实是一个具体的实现类),最下面四个是它的子类,也就是四个包装类。运用到包装模式,四个包装类可以任意嵌套InputStream的子类,是一个很典型的装饰者模式的应用。

 

因为I/O使用了装饰者模式,会有一大堆装饰用的小类。最开始学习的时候,会被其中一大堆API吓到,现在了解其工作原理,就可以很清楚的辨别出是如何组织的,使用起来就会得心应手了。

 

posted @ 2019-01-16 20:34  dioag  阅读(272)  评论(0编辑  收藏  举报