11.设计模式--装饰者模式(Decorator模式)

2021-11-11 09:40:43 浏览数 (1)

1.定义

装饰者模式是一种结构型模型,是动态的给对象增加职责,对于新增功能来说要比通过子类方式更加的灵活。

想想一下现在有一块蛋糕,他本质上就是一个蛋糕,而如果在蛋糕上加上巧克力就变成了巧克力蛋糕,而如果在蛋糕上加上草莓就变成了草莓蛋糕,如果插上代表年龄的蜡烛就变成了生日蛋糕。不管怎么变本质上都是蛋糕,只是对蛋糕进行了装饰而已。

话说曹操最看重的人莫过于关羽了,为了让关羽效忠自己又是送美女,又是送钱粮,但是关羽岂是看重如此俗物之人,他可一心只想着大哥刘备。曹操为了感化关羽一日将吕布死后剩余的日行千里的坐骑,"赤兔马"赠予关羽。如今关羽已经手握青龙偃月刀,脚踏赤兔马。通过这两种属性的装饰,如今的关羽早已战力大增。

你看关羽始终只是关羽,无论是增加了青龙偃月刀还是赤兔马本质上还是关羽,只是做了一些装饰,而青龙偃月刀和赤兔马就相当于装饰物,而关羽则是被装饰物。

2.装饰者模式结构图

Info为抽象类,为信息类,主要扮演角色为Component,相当于蛋糕或基本信息,为了协调装饰物与被装饰物的一致性。Person是Info的子类,扮演的角色为ConcreteComponent,相当于具体的蛋糕或关羽。AdditionalInfo同样也是Info的子类,只不过也是抽象类,扮演的角色为Decorator,相当于装饰物的抽象,而Arms和Mount则是对装饰物的具体实现,扮演ConcreteDecorator角色。

3.装饰者模式实现

Info为抽象类,为信息类,主要扮演角色为Component,同时提供两个方法,一个获取基本信息,另一个获取所有信息,包括附加信息。

Person是Info的子类扮演的角色为ConcreteComponent,其中获取基本信息和所有信息都是获取的name字段,因为人员的信息现在没有进行装饰,所以所有信息依然是name字段。

AdditionalInfo同样也是Info的子类,只不过也是抽象类,扮演的角色为Decorator,相当于装饰物的抽象,同时增加了一个获取附加信息的抽象方法,此方法是子类进行实现。同时Info作为委托在字段中。

Arms则是对装饰物的具体实现,扮演ConcreteDecorator角色。其中包括获取基本信息、获取武器信息、以及所有信息方法。

同样Mount也是是对装饰物的具体实现,扮演ConcreteDecorator角色。其中包括获取基本信息、获取坐骑信息、以及所有信息方法。

现在将关羽进行装饰,给附上青龙偃月刀以及赤兔马进行装饰,此时关羽已经可以随意斩颜良,诛文丑。

参考文献《图解设计模式》

代码获取地址:https://gitee.com/bughong/design-pattern

0 人点赞