一、装饰者模式简介
1. 定义
装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构,该设计模式属于结构型模式。这种设计模式创建一个装饰类,用来包装原有的类,在装饰类中既可以调用待装饰类原有的方法,还可以增加新的方法,以扩充原有类的功能。因此,装饰者模式是一种用于替代继承的技术。
2. 模式组成
- Component:一个抽象类或者一个接口,定义了属性或者方法,是ConcreteComponent和ConcreteDecorator的共同父类;
- ConcreteComponent:Component子类,实现相应的方法,是“被装饰者”角色;
- Decorator:抽象装饰类,维护一个指向ConcreteComponent对象的引用,通过该引用可以调用装饰之前的方法,并通过其子类扩展该方法,以达到装饰的目的;
- ConcreteDecorator:具体装饰类,是抽象装饰类的子类,负责添加新的功能。
二、装饰者模式实现
这里以王者荣耀里面给英雄穿戴皮肤为例,如果英雄穿戴了皮肤,那么ta将会有一定的皮肤加成,也就是说会变得更强一些。具体,以百里守约说明一下:
/**
* Component
* 一个接口:英雄
*/
public interface Hero {
public void skills();
}
/**
* ConcreteComponent
* 具体英雄:百里守约
*/
public class BailiShouYue implements Hero {
@Override
public void skills() {
System.out.println("我瞄准很强!");
}
}
/**
* Decorator
* 抽象装饰类:装饰英雄
*/
public class HeroDecorator implements Hero {
protected Hero mHero;
public HeroDecorator(Hero hero) {
this.mHero = hero;
}
@Override
public void skills() {
mHero.skills();
}
}
/**
* ConcreteDecorator
* 具体装饰类:穿戴皮肤
*/
public class SkinDecorator extends HeroDecorator {
public SkinDecorator(Hero hero) {
super(hero);
}
@Override
public void skills() {
super.skills();
System.out.println("穿上「特工魅影」的我更强了!");
}
}
测试代码如下:
private void testDecorator() {
Hero bailiShouYue = new BailiShouYue();
SkinDecorator skinDecorator = new SkinDecorator(bailiShouYue);
skinDecorator.skills();
}
输出结果:
我瞄准很强!
穿上「特工魅影」的我更强了!
三、优缺点
1. 优点
- 装饰模式比继承更加灵活性,不会导致类的个数急剧增加;
- 装饰模式可以动态扩展一个实现类的功能。
2. 缺点
- 多层装饰比较复杂。