转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409

今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义。

装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。

先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。

下面进入正题,今天在那看电影,忽然想起年轻时在游戏场上的血雨腥风啊,哈哈,下面以游戏为背景介绍装饰者模式。玩过游戏的兄弟应该都知道,游戏里面每个角色有武器、鞋子、护腕、戒指、还有各种红宝石、蓝宝石、黄宝石等等。

下面需求开始:设计游戏的装备系统,基本要求,要可以计算出每种装备在镶嵌了各种宝石后的攻击力和描述:

具体需求:

1、武器(攻击力20) 、戒指(攻击力5)、护腕(攻击力5)、鞋子(攻击力5)

2、蓝宝石(攻击力5/颗)、黄宝石(攻击力10/颗)、红宝石(攻击力15/颗)

3、每个装备可以随意镶嵌3颗

好了,需求介绍完毕,当然了,不要吐槽我的设计,尼玛鞋子哪来的攻击力,关键时刻也是可以砸人的嘛。下面开始初步的设想,出于多年面向对象的经验,我们可能会这么设计:

如果你这么设计了,我靠,就这么点需求你写了几百个类,随便添加两个宝石,哈哈,指数增长听过么,准备加班吧。

可能你还会这么设计:写一个超类,然后里面各种set宝石,然后在计算攻击力的地方,使劲的If有哪几种宝石,恭喜你,代码量不是很大,但是随便添加个武器,你得又多写多少个IF呢。

上面叙述了一些可能性的设计,都不是很好,下面看看如何将装饰者模式融入:

首先是装备的超类

[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 装备的接口
  4. *
  5. * @author zhy
  6. *
  7. */
  8. public interface IEquip
  9. {
  10. /**
  11. * 计算攻击力
  12. *
  13. * @return
  14. */
  15. public int caculateAttack();
  16. /**
  17. * 装备的描述
  18. *
  19. * @return
  20. */
  21. public String description();
  22. }

然后分别是武器、戒指、护腕、鞋子

[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 武器
  4. * 攻击力20
  5. * @author zhy
  6. *
  7. */
  8. public class ArmEquip implements IEquip
  9. {
  10. @Override
  11. public int caculateAttack()
  12. {
  13. return 20;
  14. }
  15. @Override
  16. public String description()
  17. {
  18. return "屠龙刀";
  19. }
  20. }
[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 戒指
  4. * 攻击力 5
  5. * @author zhy
  6. *
  7. */
  8. public class RingEquip implements IEquip
  9. {
  10. @Override
  11. public int caculateAttack()
  12. {
  13. return 5;
  14. }
  15. @Override
  16. public String description()
  17. {
  18. return "圣战戒指";
  19. }
  20. }
[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 护腕
  4. * 攻击力 5
  5. * @author zhy
  6. *
  7. */
  8. public class WristEquip implements IEquip
  9. {
  10. @Override
  11. public int caculateAttack()
  12. {
  13. return 5;
  14. }
  15. @Override
  16. public String description()
  17. {
  18. return "圣战护腕";
  19. }
  20. }
[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 鞋子
  4. * 攻击力 5
  5. * @author zhy
  6. *
  7. */
  8. public class ShoeEquip implements IEquip
  9. {
  10. @Override
  11. public int caculateAttack()
  12. {
  13. return 5;
  14. }
  15. @Override
  16. public String description()
  17. {
  18. return "圣战靴子";
  19. }
  20. }

接下来当然是装饰品,宝石了,首先超类

[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 装饰品的接口
  4. * @author zhy
  5. *
  6. */
  7. public interface IEquipDecorator extends IEquip
  8. {
  9. }

下来蓝宝石、黄宝石、红宝石

[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 蓝宝石装饰品
  4. * 每颗攻击力+5
  5. * @author zhy
  6. *
  7. */
  8. public class BlueGemDecorator implements IEquipDecorator
  9. {
  10. /**
  11. * 每个装饰品维护一个装备
  12. */
  13. private IEquip equip;
  14. public BlueGemDecorator(IEquip equip)
  15. {
  16. this.equip = equip;
  17. }
  18. @Override
  19. public int caculateAttack()
  20. {
  21. return 5 + equip.caculateAttack();
  22. }
  23. @Override
  24. public String description()
  25. {
  26. return equip.description() + "+ 蓝宝石";
  27. }
  28. }
[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 黄宝石装饰品
  4. * 每颗攻击力+10
  5. * @author zhy
  6. *
  7. */
  8. public class YellowGemDecorator implements IEquipDecorator
  9. {
  10. /**
  11. * 每个装饰品维护一个装备
  12. */
  13. private IEquip equip;
  14. public YellowGemDecorator(IEquip equip)
  15. {
  16. this.equip = equip;
  17. }
  18. @Override
  19. public int caculateAttack()
  20. {
  21. return 10 + equip.caculateAttack();
  22. }
  23. @Override
  24. public String description()
  25. {
  26. return equip.description() + "+ 黄宝石";
  27. }
  28. }
[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. /**
  3. * 红宝石装饰品 每颗攻击力+15
  4. *
  5. * @author zhy
  6. *
  7. */
  8. public class RedGemDecorator implements IEquipDecorator
  9. {
  10. /**
  11. * 每个装饰品维护一个装备
  12. */
  13. private IEquip equip;
  14. public RedGemDecorator(IEquip equip)
  15. {
  16. this.equip = equip;
  17. }
  18. @Override
  19. public int caculateAttack()
  20. {
  21. return 15 + equip.caculateAttack();
  22. }
  23. @Override
  24. public String description()
  25. {
  26. return equip.description() + "+ 红宝石";
  27. }
  28. }

好了,到此结束,我们已经实现了需求的功能了,是不是每个类都很清晰加简单,下面看测试:

[java]  view plain copy
  1. package com.zhy.pattern.decorator;
  2. public class Test
  3. {
  4. public static void main(String[] args)
  5. {
  6. // 一个镶嵌2颗红宝石,1颗蓝宝石的靴子
  7. System.out.println(" 一个镶嵌2颗红宝石,1颗蓝宝石的靴子");
  8. IEquip equip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip())));
  9. System.out.println("攻击力  : " + equip.caculateAttack());
  10. System.out.println("描述 :" + equip.description());
  11. System.out.println("-------");
  12. // 一个镶嵌1颗红宝石,1颗蓝宝石的武器
  13. System.out.println(" 一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的武器");
  14. equip = new RedGemDecorator(new BlueGemDecorator(new YellowGemDecorator(new ArmEquip())));
  15. System.out.println("攻击力  : " + equip.caculateAttack());
  16. System.out.println("描述 :" + equip.description());
  17. System.out.println("-------");
  18. }
  19. }

输出:

[java]  view plain copy
  1. 一个镶嵌2颗红宝石,1颗蓝宝石的靴子
  2. 攻击力  : 40
  3. 描述 :圣战靴子+ 蓝宝石+ 红宝石+ 红宝石
  4. -------
  5. 一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的武器
  6. 攻击力  : 50
  7. 描述 :屠龙刀+ 黄宝石+ 蓝宝石+ 红宝石
  8. -------

赞不赞,要是需求随便多几个装备,几种宝石,我们随随便便就可以加上,然后开开心心下班。

好了,恭喜你,你又学会了一个设计模式,装饰者模式。

现在根据例子对定义的理解,不用我多说吧。

Java的API中也有装饰者模式的身影,如果你初学Java,一定记得Java里面的各种流,很痛苦吧,但是当你明

白你们的设计之后就会感觉清晰很多。

把InputStream看作我们的IEquip,把FilterInputStream看作我们的IEquipDecorator,是不是和我们的设计几乎一样~

好了,就到这里,编程也是很有乐趣的么~是吧,各位看官留个言、给个赞呗~

源码地址:https://github.com/371894545/Decorator-pattern

Java设计模式之三--装饰者模式相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  3. (设计模式七)java设计模式之装饰器模式

    一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...

  4. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  5. java设计模式之装饰器模式

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

  6. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

  7. java设计模式之装饰者模式

    为什么80%的码农都做不了架构师?>>>    定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: ...

  8. java与模式孙悟空_由孙悟空的七十二变看Java设计模式:装饰者模式

    应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减50 每满减:每满100减10 打折:买两件8折,三件7折 数量减:满三件减去最低价的一件 假设现在顾客买了两件 ...

  9. java设计模式之装饰器模式(包装器模式)

    显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...

最新文章

  1. linux终端历史记录文件夹,如何通过命令行查看`.bash_history`文件?
  2. iPhone5或明年下半年发布 配备iOS6和A6芯片
  3. input file的默认value清空与赋值方法
  4. php读写xml文件,另辟蹊径 搞定PHP读取XML大文件 数据导入
  5. JavaTPoint Python 中文教程【翻译完成】
  6. 1006. 换个格式输出整数 (15)-PAT乙级真题
  7. XMLHttpRequest 学习(二)——封装一个ajax
  8. linux进入root编译gcc,非Root用户编译安装GCC
  9. mysql数据库多表查询出来多条重复数据--处理方法--distinct
  10. VMPlayer安装
  11. linux系统声卡安装教程,关于Linux系统声卡驱动的安装与配置
  12. ESAPI(一)索引的操作以及数据插入
  13. 当8081端口被占用了怎么办?
  14. 根据域名查询IP地址的网站推荐
  15. mysql操作基础知识
  16. Selenium+Firefox/Chrome及驱动的安装和使用
  17. 卫生统计学v是什么意思_卫生统计学名词解释
  18. 内网攻防经典技术备忘录
  19. 第七章——数据库设计
  20. 经典案例:卖票问题【线程同步】

热门文章

  1. java web 编辑器_基于Java+web的在线Java编辑器 PDF 下载
  2. 你的名字经典语录(2)
  3. 2020超级码力初赛一题解
  4. Android插件化思考
  5. IOS开发者证书申请及打包步骤
  6. 十年转型|小草十年庆,暖暖公益情
  7. 一个恶意下载器的逆向分析
  8. QGroundControl无人机地面站 QGCToolbox
  9. 计算机控制技术王超,王超 研究生副院长
  10. 实验六:派生类与继承