装饰器模式 Decorator

职责:动态的为一个对象增加新的功能 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀

优点:

  1. 扩展对象功能,比继承灵活,不会导致类个数急剧增加
  2. 可以对一个对象进行多次装饰,创建出不同行为的组合, 车 飞行汽车 增加浮沉箱,水上汽车 增加人工智能,自动驾驶 增加翅膀 得到功能更加大的对象
  3. 具体构建类和具体装饰类可以独立变化,用户可以根据需 要自己增加新的具体构件子类和具体装饰子类 缺点
  4. 产生很多小对象。大量小对象占据内存,一定程序上影响 性能
  5. 装饰模式易于出错,调试排查比较麻烦

适用于继承自同一接口和同一装饰器类下,类中的一个对象可以调用其他多个不同类的方法 代码

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 ="原味咖啡";
	@Override
	public double cost() {
		return 10;
	}

	@Override
	public String info() {
		return name;
	}
	
}
//抽象装饰类
abstract class Decorate implements Drink{
	//对抽象组件的引用
	private Drink drink;
	public Decorate(Drink drink) {
		this.drink =drink;
	}
	@Override
	public double cost() {
		return this.drink.cost();
	}

	@Override
	public String info() {
		return this.drink.info();
	}	
}

//具体装饰类
class Milk extends Decorate{

	public Milk(Drink drink) {
		super(drink);
	}
	@Override
	public double cost() {
		return super.cost()*4;
	}

	@Override
	public String info() {
		return super.info()+"加入了牛奶";
	}	
}

class Suger extends Decorate{

	public Suger(Drink drink) {
		super(drink);
	}
	@Override
	public double cost() {
		return super.cost()*2;
	}

	@Override
	public String info() {
		return super.info()+"加入了蔗糖";
	}	
}


书籍推荐