个人总结-java设计模式-装饰者模式

装饰者模式:
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方式;

理解:
1、装饰者和被装饰者有 相同的超类
2、你可以用一个或多个装饰者包装一个对象;
3、既然装饰对象和被装饰对象有相同的超类,所以在任何需要 原始对象(被包装的)的场合,可以用装饰过的对象代替它。
4、装饰者可以在所委托的被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。
5、对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

设计原则:
1、封装变化;
2、多用组合,少用继承;
3、针对接口开发,不针对实现编程;
4、为交互对象之间的松耦合设计而努力;
5、 对扩展开放,对修改关闭;

代码清单一 饮料超类
 
    
package com.bean.abstr;
/**
*
* @author gaosong
* 饮料的超类
*
*/
public abstract class Beverage {
//用于描述的属性,所有子类必须自行实现此属性
public String description ="unknown description";
//get方法
public String getDescription() {
return description;
}
//抽象的计算价格的方法,由子类实现
public abstract double cost();
 
}
代码清单二 装饰者超类
 
     
package com.bean.abstr;
 
 
/**
*
*
* @author gaosong
*装饰者超类,即所有调料的超类同样集成自饮料类
*
*/
public abstract class CondimentDecorator extends Beverage {
//定义描述的方法,具体计算价格的方法由子类实现
public abstract String getDescription();
 
}
代码清单三 coffee
 
     
package com.bean.bever;
 
import com.bean.abstr.Beverage;
/**
*
* coffee 1
*
*/
public class Espresso extends Beverage {
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
// 集成自超类的抽象方法
return 1.99;
}
 
}
 
      
package com.bean.bever;
 
import com.bean.abstr.Beverage;
/**
*
* coffee 2
*
*/
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "House Blend Coffee";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return .89;
}
 
}
代码清单四 装饰者
 
     
package com.bean.condiment;
 
import com.bean.abstr.Beverage;
import com.bean.abstr.CondimentDecorator;
/**
*
* 调料2
*
*/
public class Milk extends CondimentDecorator {
Beverage beverage;
public Milk(Beverage beverage){
this.beverage = beverage;
}
@Override
public double cost() {
// TODO Auto-generated method stub
return .19+beverage.cost();
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription()+",Milk";
}
 
}
 
      
package com.bean.condiment;
 
import com.bean.abstr.Beverage;
import com.bean.abstr.CondimentDecorator;
/**
*
* 调料1
*
*/
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription()+",Mocha";
}
@Override
public double cost() {
// TODO Auto-generated method stub
return .21+beverage.cost();
}
 
}
代码清单五 main
 
     
package com.test;
 
import com.bean.abstr.Beverage;
import com.bean.bever.Espresso;
import com.bean.bever.HouseBlend;
import com.bean.condiment.Milk;
import com.bean.condiment.Mocha;
 
public class StartbuzzCoffe {
 
/**
* @param args
*/
public static void main(String[] args) {
Beverage beverage = new Espresso();
Milk milk = new Milk(beverage);
Mocha mocha = new Mocha(milk);
System.out.println("描述:"+beverage.getDescription());
System.out.println("价格:"+beverage.cost());
System.out.println("描述:"+milk.getDescription());
System.out.println("价格:"+milk.cost());
System.out.println("描述:"+mocha.getDescription());
System.out.println("价格:"+mocha.cost());
Beverage beverage2 = new HouseBlend();
 
}
 
}

补充实例:JAVA I/O流中的装饰者

以InputStream类为例

顶层抽象超类:InputStream

具体组件:FileInputStream、StringBufferInputStream、ByteArrayInputStream  ;   抽象装饰组件:FilterInputStream
注释:以上两个组件都继承自顶层超类,抽象装饰组件用于规定具体装饰对象的基本属性和行为;具体组件则可以被装饰;

具体装饰组件:PushbackInputStream BufferedInputStream DataInputStream LineNumberInputStream
注释:所有具体装饰组件都继承自抽象装饰组件,装饰组件提供更强大的功能,可以装饰具体的组件;


输出流的各类之间的关系与输入流相同,如果有类图的话可以明显看出最上面的事例与java流的设计模式是一模一样的,所以很好的理解装饰模式,对于程序员使用java流有很大的帮助;

你可能感兴趣的:(学习笔记)