概念:动态地给一个对象添加一些额外的职责。
装饰器模式侧重于在不改变接口的前提下动态地给对象添加新功能,保持对象结构的透明性,客户端无感知。
以一个咖啡制作和装饰的例子来帮助大家理解:
public interface Coffee {double cost();String description();
}public class AmericanCoffee implements Coffee {@Overridepublic double cost() {return 2.5;}@Overridepublic String description() {return "纯美式";}
}public abstract class CoffeeDecorator implements Coffee {abstract Coffee getCoffee();
}public class SugarDecorator extends CoffeeDecorator {private Coffee coffee;public SugarDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic double cost() {return coffee.cost() + 0.5;}@Overridepublic String description() {return coffee.description() + ", 加糖";}@OverrideCoffee getCoffee() {return this.coffee;}
}public class MilkDecorator extends CoffeeDecorator {private Coffee coffee;public MilkDecorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic double cost() {return this.coffee.cost() + 0.6;}@Overridepublic String description() {return this.coffee.description() + ", 加奶";}@OverrideCoffee getCoffee() {return this.coffee;}
}public class Demo {public static void main(String[] args) {AmericanCoffee americanCoffee = new AmericanCoffee();System.out.println(americanCoffee.cost());System.out.println(americanCoffee.description());System.out.println("********************分割线*****************************");SugarDecorator sugarDecorator = new SugarDecorator(americanCoffee);System.out.println(sugarDecorator.cost());System.out.println(sugarDecorator.description());System.out.println("********************分割线*****************************");MilkDecorator milkDecorator = new MilkDecorator(sugarDecorator);System.out.println(milkDecorator.cost());System.out.println(milkDecorator.description());}
}
如果大家需要视频版本的讲解,可以关注我的B站:
八、设计模式之装饰模式精讲