这篇文章给大家分享的是有关java设计模式中装饰者模式怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
具体的代码。
至此我们实现了上述基本的需求了。但我们知道在游戏的角色中,除了携带武器外,还可以穿戴很多种饰品,也就是装备。穿戴不同的装备可以增加不同的攻击力。如果我们将上述的需求在修改的复杂一点,也就是游戏角色除了要携带武器外,还可以穿戴很多种装备。我们知道游戏中的装备很多种为了方便我们测试,我们暂时只创建护肩、胸甲、饰品等。并且游戏角色穿戴不同的装备需要为用户增加不同的攻击力。如果需求变更成这样时,那我们应该怎么修改上述的代码呢?具体的代码如下:
我们现在已经实现了新的需求了。但上面的代码虽然实现了需求,但是违背了设计模式的基本原则,也就是将程序中涉及到可能变化的部分提取出来。除此之外还违背了另一种设计模式的基本原则,也就是开放关闭原则。开放关闭原则:类应该对扩展开放,而对修改关闭。说的简单点就是,如果我们已经开发好了一个类,如果有其他的需求,这个类现在并不能满足我们的需求时,那么可以通过任何扩展的方式来改变我们这个类的行为,也就是前面说的对类的扩展是开放的。而不能通过直接在原有类中修改,这也就是前面所说的关闭,也就是说对一个已经开发好的类对它的修改是关闭的,不允许任何的修改,只能通过扩展来实现。如果我们现在要添加一个新的装备,宠物类型的话,那么显然上述的代码违背了上述这2个设计模式的基本原则了,因为我们不得不修改原先已经修改好的代码,这样很容易会导致曾经已经编写好的代码产生新的问题。那么我们怎么能解决上述的问题呢?有没有一种设计模式类似观察者模式那样呢?在我们创建新的观察者时,是不需要重新修改主题的代码的。答案一定是有的,也就是本文将要介绍的设计模式,也就是装饰者模式。下面我们看一下装饰者模式的定义。
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
上面就是装饰者模式的定义,说的比较笼统。下面我们以游戏的需求为例,在来做简单的说明。如果我们创建一个游戏角色的话,如果不设置装备的话,那么当前游戏角色就是没有穿戴任何装备,也就是当前游戏角色的攻击力只有武器。如果我们这时想要穿戴护肩这个装备的话,那么就创建这个护肩对象来装饰这个游戏角色,如果我们这时还想要穿戴胸甲的话,那么就继续创建胸甲这个对象来,继续装饰已经被护肩对象装饰的游戏角色。以此类推,并且,每个对象都负责计算自己对象的攻击力即可。这样程序在运行时,会先执行最外面的装饰对象,计算攻击力,然后在继续计算被它装饰对象的攻击力,这样就达到了我们想要的效果了,也就是动态的为对象添加相应的职责了。那我们怎么保证,不同的对象可以彼此被装饰呢?所以,在使用装饰者模式有几点需要特殊的注意。下面是几点特殊的地方。
装饰者和被装饰者对象有相同的超类型
可以用一个或多个装饰者包装一个对象
对象可以在任何时候被装饰,可以重复使用任意装饰者
下面我们将代码修改为装饰者模式,下面为具体的代码:
这样我们就将代码修改为装饰者模式的代码了,如果我们要新添加宠物装备时,我们只要新创建一个宠物类,并让该类继承装备类GameEquipment即可,并且我们并不需要修改曾经已经编写好的代码,我们只是用了类的扩展而已。下面为具体的代码。
这就是装饰者模式的好处,非常方便的扩展。但它也有相应的缺点就是会造成设计时有很多个类,因为任何一种装饰都需要定义一种类,如果我们需要更多的装备时时,那我们就要创建更多装备的装饰类,如果还有其它业务处理的话,我们又会创建符合这种需求的装饰类。这就会造成一个简单的工具类,会依赖很多个类,造成使用这个工具类的困惑。就像Java IO一样,大家都知道IO里的类其在是大多了,多到很多类压根就没有用过 ,就是因为java io 也是采用了这种装饰者模式,所以它需要为每一种可能有的需求都创建相应的装饰类,来达到装饰的目的。这也是装饰者模式的弊端。但同时也是装饰者模式的好处,也就是方便扩展,如果我们要想扩展Java IO中某些类的功能,那我们只需要创建一个新的装饰者就可以了,这样在程序中,我们就可以用我们自己创建的装饰类,来装饰Java IO中的对象了。
在Java IO中FilterInputStream类是一个抽象装饰者,我们我们要实现自己的装饰对象,那我们需要继承FilterInputStream类。具体代码如下:
直接读取txt.txt内容:
现在我们新创建了一个新的装饰类UpperCaseInputStream,也就是用这个装饰类装饰的对象,获取出的内容都会将自动转成大写字母。下面为测试用例。
这样我们就可以直接用这个UpperCaseInputStream装饰类去装饰任何FilterInputStream的类了。这也就是装饰模式的好处。
感谢各位的阅读!关于“java设计模式中装饰者模式怎么实现”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。