目录
前言
装饰者模式顾名思义,做一个装饰
对原有逻辑进行一个包装,锦上添花
动态的把新功能附加到对象上,就像插件一样,即插即用
是继承的替代方案,但比只用的继承的承弹性更大,更灵活,且遵循设计模式原则
类图
- Component:抽象组件(可以是抽象类或者接口),被装饰的原始对象
- ConcreteComponent:具体实现类,被装饰的具体对象
- Decorator:抽象装饰者,职责就是为了装饰我们的组件对象,内部一定要有一个指向组件对象的引用
- ConcreteDecoratorA:装饰者具体实现类,只对抽象装饰者做出具体实现
- ConcreteDecoratorB:同上
例子
我们在网上买了一些餐具,
餐具会经过泡沫,纸,盒子,袋子,贴上快递信息等等进行打包
最后在快递到我们手里
这一包装的过程就可以理解成装饰者模式
直接上代码:
首先我们有一个抽象的餐具类
/**
* 餐具
*
* @author wmx
* @date 2019-08-27
*/
public abstract class Tableware {
//包装盒子
abstract void packing();
}
我们买的是盘子,再来个盘子
/**
* 餐盘
*
* @author wmx
* @date 2019-08-27
*/
public class Dish extends Tableware {
//买的盘子会用盒子装着
@Override
void packing() {
System.out.println("用盒子包着");
}
}
下面就是重头戏,包装类
/**
* 包装类
*
* @author wmx
* @date 2019-08-27
*/
public class PackingDecorator extends Tableware{
Tableware tableware;
public PackingDecorator(Tableware tableware){
this.tableware = tableware;
}
@Override
void packing() {
tableware.packing();
}
}
具体的包装类
/**
* 包装泡沫
*
* @author wmx
* @date 2019-08-27
*/
public class PackingSpumeDecorator extends PackingDecorator {
public PackingSpumeDecorator(Tableware tableware) {
super(tableware);
}
public void packingWithSpume() {
System.out.println("包一圈泡沫");
}
@Override
void packing() {
packingWithSpume();
tableware.packing();
}
}
/**
* 包装袋子
*
* @author wmx
* @date 2019-08-27
*/
public class PackingBagDecorator extends PackingDecorator{
public PackingBagDecorator(Tableware tableware) {
super(tableware);
}
public void packingWithBag() {
System.out.println("包一个袋子");
}
@Override
void packing() {
tableware.packing();
packingWithBag();
}
}
商店类 — 进行包装
/**
* 商店包装商品
*
* @author wmx
* @date 2019-08-27
*/
public class Store {
public static void main(String[] args) {
//顾客买了个盘子
Tableware dish = new Dish();
//包装泡沫
dish = new PackingSpumeDecorator(dish);
//包装袋子
dish = new PackingBagDecorator(dish);
//我们如果想接着包装,可以继续扩展,继承PackingDecorator
dish.packing();
}
}
输出:
包一圈泡沫
用盒子包着
包一个袋子
我们来捋一下类之间的关系:
盘子包装的过程:
说点什么
您将是第一位评论人!