1,概念
是动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
是以对客户端透明的方式扩展对象的功能,换句话说,客户端不会察觉到装饰前与装饰后有什么不同。
在不修改底层代码情况下,给对象赋予新的职责。
2,场景(处于安全目的,保护被访问者)
现在有一个对象,我们想给他增加方法或者属性,怎么去做,并且可以随意修改增加方法和属性的顺序。
I/O、过滤器。
3,注意
①装饰者和被装饰对象有相同的超类型。
因为装饰者必须能取代被装饰者。
②可以有多个装饰者。
③装饰模式输出的过程就像拆包,拆开每一个装饰者内容。
4,优缺点
1)优
让算法的变化独立于使用算法的客户。
2)缺
造成设计中有大量的小类。
装饰者在实例化组件时,将增加代码复杂度。(不只需要实例化组件,还要把此组件包装进装饰者中)。
5,经典用例:
java.io类:
例子:用BufferedReader修饰InputStreamReader对象:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
6,实现
由4部分组成:
①抽象接口
②具体组件(要接收附加责任的类)
③抽象装饰者
④具体装饰者(给接口对象添加附加责任)
package decorator;
public class Main {
public static void main(String args[]){
Beverage beverage = new Espresso();
System.out.println("订一杯Espresso,不要调料");
System.out.println(beverage.getDescription()
+ "$" + beverage.cost());
System.out.println("-------------");
System.out.println("订一杯HouseBlend");
Beverage beverage2 = new HouseBlend();
System.out.println("加调料:Mocha装饰它");
beverage2 = new Mocha(beverage2);
System.out.println("加调料:Mocha装饰它");
beverage2 = new Mocha(beverage2);
System.out.println("加调料:Whip装饰它");
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()
+ "$" + beverage2.cost());
}
}
package decorator;
/**
* 抽象组件
* 饮料超类:接口(也可以用抽象类替代)
* @author luo
*
*/
public interface Beverage {
public double cost();
public String getDescription();
}
package decorator;
/**
* 抽象装饰者
* 调料类:抽象类
* @author luo
*
*/
public abstract class CondimentDeccorator implements Beverage{
@Override
public abstract String getDescription();
}
package decorator;
/**
* 具体组件
* 浓缩咖啡类
*
* @author luo
*
*/
public class Espresso implements Beverage {
private String description = "Espresso";
private double price = 1.2;
@Override
public double cost() {
System.out.println("Espresso价格,1.2");
return price;
}
@Override
public String getDescription() {
return description;
}
}
package decorator;
/**
* 具体组件
* 一种饮料
* @author luo
*
*/
public class HouseBlend implements Beverage {
private String description = "HouseBlend Coffee";
private double price = 1.5;
@Override
public double cost() {
System.out.println("HouseBlend价格,1.5");
return price;
}
@Override
public String getDescription() {
return description;
}
}
package decorator;
/**
* 摩卡类
*/
public class Mocha extends CondimentDeccorator{
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public double cost() {
System.out.println("Mocha调料,0.2");
return .20 + beverage.cost();
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
}
package decorator;
public class Whip extends CondimentDeccorator{
Beverage beverage;
public Whip(Beverage beverage){
this.beverage = beverage;
}
@Override
public double cost() {
System.out.println("Whip调料,0.2");
return .20 + beverage.cost();
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
}