设计模式(一)--装饰模式

 装饰模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案
* 1)装饰者和被装饰者有相同的超类型
* 2)装饰者可以在所委托被装饰者的行为之前/之后,加上自己的行为,以达到特定的目的。

/**
* Created by wqc on 2017/10/14.
* 饮料的超类:只包含饮料的描述方法description和计算价格的方法cost
*/
public abstract class Beverage {
String description = "Unknown Beverage";

public String getDescription()
{
return description;
}

public abstract double cost();
}

/**
* Created by wqc on 2017/10/14.
* 装饰者--调料的超类:所有的调料都需重新描述方法
*/
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}


/**
* Created by wqc on 2017/10/14.
* 装饰者:调料--摩卡
*/
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}

@Override
public String getDescription() {
return beverage.getDescription()+",Mocha";
}

@Override
public double cost() {
return beverage.cost()+0.20;
}
}

/**
* Created by wqc on 2017/10/14.
* 装饰者:调料--豆浆
*/
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage)
{
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+",Soy";
}

@Override
public double cost() {
return beverage.cost()+0.3;
}
}


/**
* Created by wqc on 2017/10/14.
* 被装饰者:饮料的实现类--溶缩咖啡
*/
public class Espresso extends Beverage{

public Espresso()
{
description = "Espresso";
}
@Override
public double cost() {
return 1;
}
}

/**
* Created by wqc on 2017/10/14.
* 装饰模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案
* 1)装饰者和被装饰者有相同的超类型
* 2)装饰者可以在所委托被装饰者的行为之前/之后,加上自己的行为,以达到特定的目的。
*/
public class test {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()+"---"+beverage.cost());

beverage = new Soy(beverage);
System.out.println(beverage.getDescription()+"---"+beverage.cost());

beverage = new Mocha(beverage);
System.out.println(beverage.getDescription()+"---"+beverage.cost());

}
}


 
原文地址:https://www.cnblogs.com/qingchun-com/p/7814740.html