抽丝剥茧——装饰者设计模式
Posted MakerStack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽丝剥茧——装饰者设计模式相关的知识,希望对你有一定的参考价值。
装饰者设计模式
兄弟们,开干,昨天的代理模式感觉如何。今天我们来一个简单的东东——装饰者模式,它的功能和静态代理类似,也是通过聚合增强了类的现有功能。
我们来一个生活中常见的装饰者设计模式的案例。王者荣耀的星元皮肤,一个任务原型可以给其增加不同的装饰;一个皮肤可以拥有外观,动效等的装饰等等。这就是一个非常经典的装饰者模式的案例。
我们基于上述王者荣耀的星元皮肤案例,画一个图瞅瞅。
是不是很完美。我们仔细看一下里面各个元素的含义
-
英雄。这个代表了所有要被装饰的接口或者抽象类,多态思想方便扩展 -
韩信。代表了英雄这个接口或者抽象类的实现,具体的被装饰对象 -
皮肤。代表了对这个英雄的抽象装饰。 -
武器和衣服。代表了对这个英雄的具体装饰规则
接下来我们来官方聊一下装饰者模式
装饰者模式构成
-
抽象构建角色( Component
):一个对象接口或者抽象类,可以给这些对象动态的添加职责。 「英雄」 -
具体构建角色( ConcreteComponent
):实际被动态添加职责的对象。 「韩信」 -
抽象装饰者角色( Decorator
):实现了Component
接口,用来扩展Component
类的功能。 「皮肤」 -
具体装饰者角色( ConcreateDecorator
):动态地添加职责的对象。 「武器和衣服」
来一个具体的类图实现
理论干完,来看看实际代码。
「抽象构建角色。英雄」
interface Hero{
void attack();
}
「具体构建角色。韩信」
class HanXin implements Hero{
@Override
public void attack() {
System.out.println("赵子龙参见陛下");
}
}
「抽象装饰者角色。皮肤」
class Skin implements Hero{
private Hero hero ;
public Skin(Hero hero){
this.hero = hero ;
}
@Override
public void attack(){
hero.attack();
}
}
「具体装饰者角色」
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);
}
}
「具体调用」
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();
}
}
看完这段代码以后,是不是感觉我们的装饰者模式和昨天的代理模式有异曲同工之妙,特别是和静态代理模式,也是对一个类进行了一个增强修饰,只不过代理模式强调的是修改对象的行为,而装饰者模式强调的是增强对象的行为。
以上是关于抽丝剥茧——装饰者设计模式的主要内容,如果未能解决你的问题,请参考以下文章