Java设计模式-7、装饰器模式
装饰器模式
装饰器模式主要对现有的类对象进⾏包裹和封装,以期望在不改变类对象 及其类定义的情况下,为对象添加额外功能。是⼀种对象结构型模式。需 要注意的是,该过程是通过调⽤被包裹之后的对象完成功能添加的,⽽不 是直接修改现有对象的⾏为,相当于增加了中间层。
Decorator模式比生成子类更为灵活 。装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
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. 结果
总结:
装饰模式其实就是在已有的功能动态的添加更多功能的一种方式。在房子上装修。
但是装修顺序一定要注意。