简单理解:
普通咖啡加以包装(加奶或者其他什么)成为卡布奇诺咖啡或者摩卡咖啡
代码理解:
实现了同一个接口或者继承同一个父类的对象对另一个接口实现对象或者子类包装加工
接口:
package com.whereta.decorator;
/**
* Vincent 创建于 2016/4/23.
* 咖啡接口
*/
public interface ICoffee {
String getName();
float getPrice();
}
普通咖啡:
package com.whereta.decorator;
/**
* Vincent 创建于 2016/4/23.
* 普通咖啡
*/
public class Coffee implements ICoffee {
private String name = "咖啡";
private float price = 20.0f;
public String getName() {
return name;
}
public float getPrice() {
return price;
}
}
卡布奇诺咖啡:
package com.whereta.decorator;
/**
* Vincent 创建于 2016/4/23.
* 装饰类--卡布奇诺咖啡
*/
public class CappuccinoCoffee implements ICoffee {
private ICoffee beverage;
public CappuccinoCoffee(ICoffee beverage) {
this.beverage = beverage;
}
public String getName() {
return "卡布奇诺"+beverage.getName();
}
public float getPrice() {
return 5+beverage.getPrice();
}
}
测试:
package com.whereta.decorator;
/**
* Vincent 创建于 2016/4/23.
*/
public class Main {
public static void main(String[] args) {
ICoffee coffee=new Coffee();
ICoffee cappuccinoCoffee=new CappuccinoCoffee(coffee);
String name = cappuccinoCoffee.getName();
float price = cappuccinoCoffee.getPrice();
System.out.println("name="+name);
System.out.println("price="+price);
}
}
输出:
name=卡布奇诺咖啡
price=25.0
jdk代码中最常见的就是IO流中:
DataOutputStream dataOutputStream=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("/usr/test.txt")));
以上代码就是使用到装饰模式
在DataOutputStream里:
public DataOutputStream(OutputStream out) {
super(out);
}
public synchronized void write(byte b[], int off, int len)
throws IOException
{
out.write(b, off, len);
incCount(len);
}