职责:动态的为一个对象增加新的功能
装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀
优点:
- 扩展对象功能,比继承灵活,不会导致类个数急剧增加
- 可以对一个对象进行多次装饰,创建出不同行为的组合,
车
飞行汽车
增加浮沉箱,水上汽车
增加人工智能,自动驾驶
增加翅膀
得到功能更加大的对象 - 具体构建类和具体装饰类可以独立变化,用户可以根据需
要自己增加新的具体构件子类和具体装饰子类
缺点 - 产生很多小对象。大量小对象占据内存,一定程序上影响
性能 - 装饰模式易于出错,调试排查比较麻烦
适用于继承自同一接口和同一装饰器类下,类中的一个对象可以调用其他多个不同类的方法
代码
package com.sxt.io;/*** 模拟咖啡* 1、抽象组件:需要装饰的抽象对象(接口或抽象父类)* 2、具体组件:需要装饰的对象* 3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法* 4、具体装饰类:被装饰的对象* @author TW**/public class DecorateTest02 {public static void main(String[] args) {Drink coffee =new Coffee();Drink suger =new Suger(coffee); //装饰System.out.println(suger.info()+"-->"+suger.cost());Drink milk =new Milk(coffee);//装饰System.out.println(milk.info()+"-->"+milk.cost());milk =new Milk(suger);//装饰System.out.println(milk.info()+"-->"+milk.cost());}}//抽象组件interface Drink{double cost(); //费用String info(); //说明}//具体组件class Coffee implements Drink{private String name ="原味咖啡";@Overridepublic double cost() {return 10;}@Overridepublic String info() {return name;}}//抽象装饰类abstract class Decorate implements Drink{//对抽象组件的引用private Drink drink;public Decorate(Drink drink) {this.drink =drink;}@Overridepublic double cost() {return this.drink.cost();}@Overridepublic String info() {return this.drink.info();}}//具体装饰类class Milk extends Decorate{public Milk(Drink drink) {super(drink);}@Overridepublic double cost() {return super.cost()*4;}@Overridepublic String info() {return super.info()+"加入了牛奶";}}class Suger extends Decorate{public Suger(Drink drink) {super(drink);}@Overridepublic double cost() {return super.cost()*2;}@Overridepublic String info() {return super.info()+"加入了蔗糖";}}
