装饰者设计模式
兄弟们,开干,昨天的代理模式感觉如何。今天我们来一个简单的东东——装饰者模式,它的功能和静态代理类似,也是通过聚合增强了类的现有功能。
我们来一个生活中常见的装饰者设计模式的案例。王者荣耀的星元皮肤,一个任务原型可以给其增加不同的装饰;一个皮肤可以拥有外观,动效等的装饰等等。这就是一个非常经典的装饰者模式的案例。
我们基于上述王者荣耀的星元皮肤案例,画一个图瞅瞅。
是不是很完美。我们仔细看一下里面各个元素的含义
- 英雄。这个代表了所有要被装饰的接口或者抽象类,多态思想方便扩展
- 韩信。代表了英雄这个接口或者抽象类的实现,具体的被装饰对象
- 皮肤。代表了对这个英雄的抽象装饰。
- 武器和衣服。代表了对这个英雄的具体装饰规则
接下来我们来官方聊一下装饰者模式
装饰者模式构成
- 抽象构建角色(
Component
):一个对象接口或者抽象类,可以给这些对象动态的添加职责。「英雄」 - 具体构建角色(
ConcreteComponent
):实际被动态添加职责的对象。「韩信」 - 抽象装饰者角色(
Decorator
):实现了Component
接口,用来扩展Component
类的功能。「皮肤」 - 具体装饰者角色(
ConcreateDecorator
):动态地添加职责的对象。「武器和衣服」
来一个具体的类图实现
理论干完,来看看实际代码。
「抽象构建角色。英雄」
代码语言:javascript复制interface Hero{
void attack();
}
「具体构建角色。韩信」
代码语言:javascript复制class HanXin implements Hero{
@Override
public void attack() {
System.out.println("赵子龙参见陛下");
}
}
「抽象装饰者角色。皮肤」
代码语言:javascript复制class Skin implements Hero{
private Hero hero ;
public Skin(Hero hero){
this.hero = hero ;
}
@Override
public void attack(){
hero.attack();
}
}
「具体装饰者角色」
代码语言:javascript复制class Weapons extends Skin{
@Override
public void attack() {
System.out.println("我的大刀在哪里");
super.attack();
}
public Weapons(Hero hero) {
super(hero);
}
}
class Clothes extends Skin{
@Override
public void attack() {
System.out.println("我的战袍准备好了嘛");
super.attack();
}
public Clothes(Hero hero) {
super(hero);
}
}
「具体调用」
代码语言:javascript复制public class DecoratorDesgin {
public static void main(String[] args) {
//全部都装饰
Hero hero1 = new Skin(new Weapons(new Clothes(new HanXin())));
hero1.attack();
//部分装饰
Hero hero2 = new Skin(new Clothes(new HanXin()));
hero2.attack();
}
}
看完这段代码以后,是不是感觉我们的装饰者模式和昨天的代理模式有异曲同工之妙,特别是和静态代理模式,也是对一个类进行了一个增强修饰,只不过代理模式强调的是修改对象的行为,而装饰者模式强调的是增强对象的行为。