[Design Pattern] The Decorator Pattern
发布日期:2021-10-01 08:44:56
浏览次数:2
分类:技术文章
本文共 2067 字,大约阅读时间需要 6 分钟。
作者: 按照常理,还是先阐述基本概念,Decorator Pattern可以用即时战略游戏中兵种的装甲强度来理解,举一个典型的例子,魔兽争霸(或冰峰王座等)中山丘是个非常厉害的角色了,经常能够一锤击毙敌人的英雄和士兵,因此被誉为英雄杀手。既然是英雄杀手,时常需要冲锋陷阵,在作战过程中自然会面临敌人的围攻,此时我们有多种方式来提升山丘的抗击打能力,一种是升级他的护甲,一种是通过魔法师给他施加增加防护的魔法,一种是等级到6时使用终极魔法来大幅度提高装甲的防护,还有一种就是使用无敌的魔法瓶,在规定时间内谁都拿他没辙,等等。虽然我不知道暴雪公司的工程师具体是如何实现这种功能设计的,但绝对不会是准备多个具有不同防御等级的山丘对象来供程序调用,如Shanqiu1、Shanqiu2……ShanqiuN,这样设计笨拙,代码繁多,如果游戏中其他兵种的装甲、攻击力的设计都是如此,那即使是天才团队也会天天在上帝面前祷告的。 Decorator Pattern在这种情况下就可以发挥作用了,在普通装甲升级时,使用普通的装甲升级的装饰器,在使用终极魔法时,使用终极魔法装甲升级的装饰器。 public abstract class Soldier { String info = "Soldier's name:"; public String getInfo() { return info; } public abstract int armor();} public abstract class SoldierDecorator extends Soldier { public abstract String getInfo();} public class NormalArmorUpdate extends SoldierDecorator { Soldier soldier; public NormalArmorUpdate(Soldier soldier) { this.soldier = soldier; } public String getInfo() { return soldier.getInfo() + "Shanqiu normal update!"; } public int armor() { return soldier.armor() + 1; }} public class MagicArmorUpdate extends SoldierDecorator { Soldier soldier; public MagicArmorUpdate(Soldier soldier) { this.soldier = soldier; } public String getInfo() { return soldier.getInfo() + "Shanqiu magic update!"; } public int armor() { return soldier.armor() + 5; }} public class Shanqiu extend Soldier { public int armor() { // 初始装甲厚度 return 3; }} public class PlayingGame { public static void main(String args[]) { Soldier soldier = new Shanqiu(); System.out.println("Initialized armor:" + soldier.armor()); // 普通装甲升级 soldier = new NormalArmorUpdate(soldier); System.out.println("Initialized armor:" + soldier.armor()); // 使用终极魔法后装甲升级 soldier = new MagicArmorUpdate(soldier); System.out.println("Initialized armor:" + soldier.armor()); }}
这样就避免了建立多个Shanqiu类来描述他的不同状态,终极魔法时间过去后,还可以增加一个Decorator来减去相应的装甲厚度,给编程带来了方便。 Decorator Pattern设计的目的,是为了能够在运行时而不是编译期来动态改变对象的状态,使用组合的方式来增减Decorator,而不是去修改原有的代码来满足业务的需要,这样利于程序的扩展。当然,在Java中使用接口同样能够轻便的实现文中描述的业务需要,但哪种更好,哪种更优? Java中的IO提供了大量Decorator Pattern设计的实例,在笔者很久的中对此进行了简单介绍,建议还是看看JDK的帮助文档。 参考资料:《Head First Design Pattern》 转载地址:https://blog.csdn.net/iteye_263/article/details/81404209 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月26日 15时25分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
POJ 1703 Find them, Catch them【种类并查集】
2019-04-28
POJ 2492 A Bug‘s Life【种类并查集】
2019-04-28
POJ 2236 Wireless Network【并查集】
2019-04-28
LeetCode C++ 214. Shortest Palindrome【字符串】困难
2019-04-28
洛谷 P2580 于是他错误的点名开始了【字典树/Map】
2019-04-28
HDU 3336 Count the string【KMP的next数组性质】
2019-04-28
洛谷 P1196 [NOI2002]银河英雄传说【带权并查集】
2019-04-28
HDU 4825 Xor Sum【01字典树/贪心】(两数最大/最小异或和)
2019-04-28
洛谷 P4551 最长异或路径【01字典树/贪心】
2019-04-28
LeetCode 921. 使括号有效的最少添加(栈)
2019-04-28
LeetCode 1018. 可被 5 整除的二进制前缀
2019-04-28
LeetCode 961. 重复 N 次的元素
2019-04-28
LeetCode 925. 长按键入(双指针)
2019-04-28
LeetCode 1309. 解码字母到整数映射
2019-04-28
LeetCode 873. 最长的斐波那契子序列的长度(动态规划)
2019-04-28
LeetCode 123. 买卖股票的最佳时机 III(动态规划)
2019-04-28
LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)
2019-04-28
PageRank 算法
2019-04-28