您的位置:首页 > 编程语言

【编程素质】设计模式-装饰模式:处于安全目的,保护被访问者

2016-10-19 22:54 405 查看

1,什么是装饰模式(Decorator)

(1)概念:

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

   又名包装(Wrapper)模式。
   是以对客户端透明的方式扩展对象的功能,换句话说,客户端不会察觉到装饰前与装饰后有什么不同。
   在不修改底层代码情况下,给对象赋予新的职责。

(2)场景:

   I/O、过滤器。

(3)注意

   ①装饰者和被装饰对象有相同的超类型。

     因为装饰者必须能取代被装饰者。

   ②可以有多个装饰者。

   ③装饰模式输出的过程就像拆包,拆开每一个装饰者内容。

(4)优缺点

   优:
     让算法的变化独立于使用算法的客户。
   缺:
     造成设计中有大量的小类。
     装饰者在实例化组件时,将增加代码复杂度。(不只需要实例化组件,还要把此组件包装进装饰者中)。

2,经典用例:

  java.io类:



  例子:用BufferedReader修饰InputStreamReader对象:BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

3,demo

  由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";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: