装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
一、装饰器模式介绍
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
何时使用:在不想增加很多子类的情况下扩展类。
如何解决:将具体功能职责划分,同时继承装饰者模式。
关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。
1、业务场景:打包水果时,需要做打防伪/加固/加急等一些附加动作;如图:
2、装饰器模式 ---------希望在不影响业务主流程的前提下,在打包环节增加防伪/加固/加急等功能。
3、时序图:装饰器模式 ---------动态地给一个对象增加一些额外的职责,为的是功能增强。
二、测试代码结合前几篇设计模式:
1、创建一个包装的装饰器:
public class BagDecorator implements Bag {
private Bag bag; //维持一个对抽象构件对象的引用
public BagDecorator(Bag bag) //注入一个抽象构件类型的对象
{
this.bag = bag;
}
public void pack() {
bag.pack();
}
}
2、创建防伪装饰器:
public class CheckedBagDecorator extends BagDecorator {
public CheckedBagDecorator(Bag bag) {
super(bag);
}
public void pack() {
super.pack(); //调用原有业务方法
checked(); //打印防伪标识
}
//增加防伪标识
public void checked() {
System.out.println("------");
System.out.println("打印上防伪标识");
}
}
3、加固装饰器:
public class ReinforceBagDecorator extends BagDecorator {
public ReinforceBagDecorator(Bag bag) {
super(bag);
}
public void pack() {
super.pack(); //调用原有业务方法
reinforce();
}
//加固包装
public void reinforce() {
System.out.println("------");
System.out.println("加固了包装");
}
}
4、加急装饰器:
public class SpeedDecorator extends BagDecorator {
public SpeedDecorator(Bag bag) {
super(bag);
}
public void pack() {
super.pack(); //调用原有业务方法
speedy();
}
//快件加急
public void speedy() {
System.out.println("------");
System.out.println("打上加急标识");
}
}
5、水果工厂:
/**
* 水果工厂
*/
public class AppleFactory extends AbstractFactory{
@Override
public Fruit getFruit() {
return new Apple();
}
@Override
public Bag getBag() {
return new AppleBag();
}
}
6、客户端测试:
/**
* 装饰器模式测试
*/
public class DecoratorClient {
public static void main(String[] args){
sendFruit();
}
public static void sendFruit(){
AbstractFactory factory = new AppleFactory();
//得到水果
Fruit fruit = factory.getFruit();
fruit.draw();
//得到包装
Bag bag = factory.getBag();
//现需要增加防伪标识
bag = new CheckedBagDecorator(bag);//防伪功能
bag = new ReinforceBagDecorator(bag);//加固功能
bag = new SpeedDecorator(bag);//加急功能
bag.pack();
}
}
7、执行结果:
到此装饰器设计模式分享完成,项目中多总结思考,下篇分析代理模式,敬请期待!