Java设计模式-7、装饰器模式

装饰器模式

        装饰器模式主要对现有的类对象进⾏包裹和封装,以期望在不改变类对象 及其类定义的情况下,为对象添加额外功能。是⼀种对象结构型模式。需 要注意的是,该过程是通过调⽤被包裹之后的对象完成功能添加的,⽽不 是直接修改现有对象的⾏为,相当于增加了中间层。

Decorator模式比生成子类更为灵活 。装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

  Java设计模式-7、装饰器模式_第1张图片

Component: 对象的接⼝类,定义装饰对象和被装饰对象的共同接⼝;
ConcreteComponent: 被装饰对象的类定义;
Decorator: 装饰对象的抽象类,持有⼀个具体的被修饰对象,并实现接⼝
类继承的公共接⼝;
ConcreteDecorator:  具体的装饰器,负责往被装饰对象添加额外的功
能;

特殊场景:

1. 如果⽤继承来扩展对象⾏为的⽅案难以实现或者根本不可⾏, 你可以使⽤
该模式。
2 .许多编程语⾔使⽤ final 最终关键字来限制对某个类的进⼀步扩展。 复⽤ 最终类已有⾏为的唯⼀⽅法是使⽤装饰模式: ⽤封装器对其进⾏封装。

应用场景:

*Java I/O 中的装饰者模式 ---继承了FilterInputStream的类就是装饰者类
--整个Java IO体系都是基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类
*spring session 中的装饰者模式
*Mybatis 缓存中的装饰者模式

代码:

1. 基类
/**
 * 被装饰对象的基类
 * @author WHM
 *
 */
public abstract class Tea {

	public abstract String desc();

	public abstract double price();
}

2 .原继承基类子类

public class Coffee extends Tea {

	public String desc() {
		return "拿铁";
	}

	public double price() {
		return 10;
	}
}

3. 原继承基类子类2 

public class MilkTea extends Tea {

	public String desc() {
		return "奶茶";
	}

	public double price() {
		return 8;
	}
}

4. 装饰器基类

public class MixDecorator extends Tea {

	private Tea tea;

	public MixDecorator(Tea tea) {
	    this.tea = tea;
	}

	public String desc() {
		return tea.desc();
	}

	public double price() {
		return tea.price();
	}
}

5. 写3个装饰器

/**
 * 布丁装饰器
 * @author WHM
 *
 */
public class Pudding extends MixDecorator {

	  public Pudding(Tea tea) {
	    super(tea);
	  }

	  @Override
	  public String desc() {
	    return super.desc() + "加布丁,";
	  }

	  @Override
	  public double price() {
	    return super.price() + 2;
	  }
}
/**
 * 珍珠装饰器
 * @author WHM
 *
 */
public class Pearl extends MixDecorator {

	public Pearl(Tea tea) {
		super(tea);
	}

	public String desc() {
		return super.desc() + "加珍珠,";
	}

	public double price() {
		return super.price() + 1;
	}
}
/**
 * 燕麦装饰器
 * @author WHM
 *
 */
public class Oats extends MixDecorator {

	public Oats(Tea tea) {
		super(tea);
	}

	public String desc() {
		return super.desc() + "加燕麦,";
	}

	public double price() {
		return super.price() + 1;
	}
}

6. 验证   一定要注意装修的顺序,这里可以结合责任链模式一起使用

/**
 * 场景:先定奶茶/咖啡   ;后加布丁,珍珠
 * @author WHM
 *
 */
public class TMain {

	public static void main(String[] args) {
		Tea tea;
	    tea = new Coffee();
	    System.out.println(tea.desc()+"销售价格:"+tea.price());

	    tea = new MilkTea();
	    tea = new Oats(tea);
	    tea = new Pearl(tea);
	    tea = new Pudding(tea);
	    System.out.println(tea.desc() + "销售价格:"+tea.price());
	}

}

7. 结果

总结:

装饰模式其实就是在已有的功能动态的添加更多功能的一种方式。在房子上装修。

但是装修顺序一定要注意。

你可能感兴趣的:(设计模式,装饰器模式,设计模式)