之前使用适配器模式我已经成功地将一只猫变成了猫娘,但是这只猫娘除了长得和猫不一样以外,好像和猫也没什么区别。现在我想给这只猫娘训练训练,让她掌握一些新技能,这个过程用到的便是装饰模式(Decorator Pattern)。
下面是我们获得的初始猫娘,没什么技能,只会站着当看板娘:
但是有时候我们创建一个猫娘只想让她当看板娘,所以说在装饰之前要保留一个实现:
根据从工厂方法模式养成下来的抽象习惯,这里纷繁复杂的各种装饰也要抽象出一个NekoDerator类,方便后续派生。
这里要注意一点:我们只是对原有的Neko类进行装饰,根据开闭原则是不能改变被修饰的Neko类原本的样子的。但是我们还希望得到含有Neko类本来信息的实例对象,所以要把Neko类的实例加入到NekoDerator类的属性之中,并在所有的Deractor类中使用Neko类进行自身构造。
现在我想拥有一只超级猫娘,这只猫娘会做家务、帮我做原神委托,甚至长翅膀会飞。现在我分别对这三个技能进行装饰。当然,这三个功能都需要猫娘在场,所以都得对showBody()进行覆写。而这三项技能也需要分别拥有自己的个性化方法,即doHouseWork()、playGenshin()和fly(),其中“飞”这个技能还需要有一对翅膀,所以要在FlyNekoDeractor类里加入新属性Wing。最终效果如下:
目前这三个装饰类均可通过继承关系往上追溯到Neko类,而且它们的构造也均是根据传入的Neko构造类进行,这就形成了一个套娃的过程:
于是我可以通过HouseworkNekoDeractor->GameNekoDeractor->FlyNekoDeractor的套娃过程,最终得到我想要的超级猫娘。
可是好景不长,很快一只会飞的猫就引起了公众恐慌,于是我只能让我这只猫娘的移动方式改成正常走路。由于我提前预想了后续可能会有其他装饰加入的情况,便可以在不违反开闭原则的情况下创建一只不会引发大众恐慌的超级猫娘: