/**
* 装饰者模式,动态的将责任附加到对象上,更容易扩展。
* 优点:1.装饰者模式比继承提供更多的灵活性
* 2.可以动态的扩展一个对象的功能
* 3.不同的装饰者进行自由组合
* 栗子:Java I/O
*/
/**
* @Author : haojiangt 这是我自己模仿写的一个小栗子
* @Description : 抽象类 饮料
* 有两个方法:一个是对于自己的描述,一个是关于饮料的价钱。
**/
public abstract class Beverage {
String description = "Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
public static void main(String[] args){
//实例化一杯可乐
Beverage cola = new Cola();
//在可乐里加冰,加牛奶
cola = new IceDecorator(cola);
cola = new MilkDecorator(cola);
System.out.println(cola.getDescription() + " " + cola.cost());
//实例化一杯咖啡
Beverage coffee = new Coffee();
//在咖啡里加冰,加牛奶
coffee = new IceDecorator(coffee);
coffee = new MilkDecorator(coffee);
System.out.println(coffee.getDescription() + " " +coffee.cost());
/*
* out:
* Milk Ice cola 6.0
* Milk Ice coffee 5.0
*/
}
}
/**
* @Author : haojiangt
* @Description :饮料的实现类可乐
**/
public class Cola extends Beverage{
public Cola (){
this.description = "cola";
}
//可乐的价格是一杯三块
@Override
public double cost() {
return 3;
}
}
/**
* @Author : haojiangt
* @Description :饮料的实现类咖啡
**/
public class Coffee extends Beverage{
public Coffee(){
this.description = "coffee";
}
//咖啡的价格是一杯两块
@Override
public double cost() {
return 2;
}
}
/**
* @Author : haojiangt
* @Description : 装饰者接口
**/
public abstract class Decorator extends Beverage{
@Override
public abstract String getDescription();
}
/**
* @Author : haojiangt
* @Description : 冰块装饰者
**/
public class IceDecorator extends Decorator {
Beverage beverage;
//注入一个饮料接口,
public IceDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return "Ice " + beverage.getDescription();
}
@Override
public double cost() {
return 1 + beverage.cost();
}
}
/**
* @Author : haojiangt
* @Description : 牛奶装饰者
**/
public class MilkDecorator extends Decorator{
Beverage beverage;
//注入一个饮料接口,
public MilkDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return "Milk " + beverage.getDescription();
}
@Override
public double cost() {
return 2 + beverage.cost();
}
}
写在最后:
为什么装饰者Decorator 继承 Beverage呢?因为继承了这个类以后装饰者Decorator也可以当作Beverage这个类来用,同时呢,又方便扩展Beverage本来没有的功能。
本文介绍装饰者模式的应用,通过一个饮料价格计算的例子展示了如何动态地为对象添加职责,而不使用继承。装饰者模式使得功能扩展更为灵活,尤其适用于Java I/O等场景。
1709

被折叠的 条评论
为什么被折叠?



