java23种设计模式之装饰器模式
上一节说到桥接模式: https://blog.****.net/zhanglei082319/article/details/88406311
桥接模式:将不同的两个对象通过某种平台连接在一起使用,称之为桥接模式。
今天说一下一种新的设计模式:装饰器模式
装饰器模式定义: 为一个业务实现,添加该业务内一些其他的职责,称之为装饰器模式。
还是从手机生产这个话题来讲,我们知道每个手机生产车间都会有包装这个流水线通道。那么就手机产品包装这个业务流程来说,它又可以分为很多子业务,比如包装耳机,包装充电器,包装手机,包装说明书,最后包装完成发货等等。那么这一条线下来我们用java代码如何实现呢?
请看下面:
首先我们需要定义一个包装业务接口。
/**
* 手机包装业务接口
*/
public interface Bag {
/**
* 包装
*/
void pack();
}
然后定义一个默认的包装实现类,这里这个默认的实现我们就实现最后一步:打包发货
/**
* 默认包装实现
*/
public class DefaultBag implements Bag{
@Override
public void pack() {
System.out.println("打包完成,发货!");
}
}
后面就是包装中各个子环节。
/**
* 包装耳机
*/
public class HeadSetBag implements Bag {
/**
* 内部新的包装修饰
*/
private Bag bag;
public HeadSetBag(Bag bag){
this.bag = bag;
}
@Override
public void pack() {
System.out.println("包装耳机!");
bag.pack();
}
}
/**
* 包装充电器
*/
public class ChargerBag implements Bag {
/**
* 内部新的包装修饰
*/
private Bag bag;
public ChargerBag(Bag bag){
this.bag = bag;
}
@Override
public void pack() {
System.out.println("包装充电器!");
bag.pack();
}
}
/**
* 添加说明书包装
*/
public class InstructionBag implements Bag{
/**
* 内部新的包装修饰
*/
private Bag bag;
public InstructionBag(Bag bag){
this.bag = bag;
}
@Override
public void pack() {
System.out.println("包装说明书!");
bag.pack();
}
}
/**
* 外包装
*/
public class PackageBag implements Bag {
/**
* 内部新的包装修饰
*/
private Bag bag;
public PackageBag(Bag bag){
this.bag = bag;
}
@Override
public void pack() {
System.out.println("添加外包装!");
bag.pack();
}
}
/**
* 贴上地址标签
*/
public class AddressTagPag implements Bag {
/**
* 内部新的包装修饰
*/
private Bag bag;
public AddressTagPag(Bag bag){
this.bag = bag;
}
@Override
public void pack() {
System.out.println("贴上地址收件人标签!");
bag.pack();
}
}
到此为止,采用装饰器模式的手机包装业务就此完成。我们测试一下:
public class Main {
public static void main(String[] args) {
//耳机
Bag bag = new HeadSetBag(
//说明书
new InstructionBag(
//充电器
new ChargerBag(
//打外包装
new PackageBag(
//贴标签
new AddressTagPag(
//打包完成 发货
new DefaultBag()
)
)
)
)
);
bag.pack();
}
}
打印结果:
这样将手机包装的业务用java装饰器模式来实现,是不是很优雅。
其实装饰器模式在实际项目中也有很多应用。比如mybatis中的缓存器就是使用装饰器模式,
mybatis提供默认缓存器,日志缓存器,同键阻塞缓存器,定时清空缓存器,阻塞缓存器,固定大小缓存器等。将这些缓存器用装饰器模式可以很灵活的结合着使用。