博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初探装饰器模式
阅读量:6951 次
发布时间:2019-06-27

本文共 3156 字,大约阅读时间需要 10 分钟。

装饰器模式:动态地将责任附加到对象上,允许用户向现有对象添加新功能而不改变其结构。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。

场景:假如有这样一个抽象装备类

package pattern.decorator;public abstract class Equipment {    int power;//战斗力    String desc = "";//介绍    public String getDesc(){        return desc;    }    //获取战斗力    public abstract int getPower();}

然后实现一个武器类继承上面的装备类

package pattern.decorator;public class Weapon extends Equipment {    public Weapon(){        desc = "屠龙宝刀";        power = 1000000;    }    @Override    public int getPower() {        return power;    }}

一段时间后,装备增加了进阶,时装,强化等功能,这些功能都可以提升战斗力,现在希望计算提升后的战斗力。

先不管其他方法是怎么实现这个需求的,让我们来看看装饰器模式是怎么设计的,并且不会改变上面的Weapon类。

 

首先,设计一个装备的装饰器抽象类

package pattern.decorator;public abstract class Decorator extends Equipment {    //显示都装饰了什么    public abstract String getDesc();}

然后实现强化,进阶,时装的装饰类

强化(强化一次战力提升1000):

package pattern.decorator;public class StrengthDecorator extends Decorator {    Equipment equipment;//需要被装饰的装备    int strength = 0;//强化了多少    public StrengthDecorator(Equipment equipment,int strength){        this.equipment = equipment;        this.strength = strength;    }    @Override    public String getDesc() {        return "强化了"+strength+"次"+","+equipment.getDesc();    }    @Override    public int getPower() {        return equipment.getPower() + 1000*strength;    }}

进阶(进阶一次战力提升2000):

package pattern.decorator;public class AdvanceDecorator extends Decorator {    Equipment equipment;//需要被装饰的装备    int advance = 0;//进阶了多少    public AdvanceDecorator(Equipment equipment, int advance){        this.equipment = equipment;        this.advance = advance;    }    @Override    public String getDesc() {        return "进阶了"+advance+"次"+","+equipment.getDesc();    }    @Override    public int getPower() {        return equipment.getPower() + 2000*advance;    }}

时装(根据不同的时装提升战力):

package pattern.decorator;public class FactionDecorator extends Decorator {    Equipment equipment;//需要被装饰的装备    String faction = "";//进阶了多少    int add = 0;    public FactionDecorator(Equipment equipment, int faction){        this.equipment = equipment;        if(faction==1){            this.faction = "春节时装";            add = 5000;        }else{            this.faction = "普通时装";            add = 2500;        }    }    @Override    public String getDesc() {        return faction+","+equipment.getDesc();    }    @Override    public int getPower() {        return equipment.getPower() + add;    }}

最后实现个测试类看看装饰器模式是怎么运作的

 
package pattern.decorator; public class ShowController {
public static void main(String[] args) {
Equipment weapon = new Weapon(); System.out.println(weapon.getDesc()+",战力:"+weapon.getPower()); weapon = new AdvanceDecorator(weapon,10); System.out.println(weapon.getDesc()+",战力:"+weapon.getPower()); weapon = new FactionDecorator(weapon,1); System.out.println(weapon.getDesc()+",战力:"+weapon.getPower()); weapon = new StrengthDecorator(weapon,15); System.out.println(weapon.getDesc()+",战力:"+weapon.getPower()); } }
 

运行结果:

屠龙宝刀,战力:1000000

进阶了10次,屠龙宝刀,战力:1020000
春节时装,进阶了10次,屠龙宝刀,战力:1025000
强化了15次,春节时装,进阶了10次,屠龙宝刀,战力:1040000

转载于:https://www.cnblogs.com/yzdtofly/p/9449355.html

你可能感兴趣的文章
数据包嗅探工具:HTTP请求/响应分析工具
查看>>
计算地球表面任意两个GPS点之间的球面距离
查看>>
编译程序加不加 -lpthread 的区别【转】
查看>>
Windows 8实用窍门系列:4.Windows 8的常用鼠标事件
查看>>
.NET中的三种Timer的区别和用法(转)
查看>>
用c# 实现设计器 DesignSurface<转>
查看>>
网络编程TCP总结及实践-C语言
查看>>
C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名...
查看>>
C语言读取每一行文本
查看>>
推荐一个AutoCad查看器——Free DWG Viewer试用
查看>>
背景-需要-需求规格
查看>>
4.6. CSS Sprite
查看>>
博客园首页博问闪存新随笔联系订阅管理 随笔- 252 文章- 0 评论- 45 HashPasswordForStoringInConfigFile中的Md5算法并非常用的Md5算法...
查看>>
OpenGL入门笔记(十三)
查看>>
Web趋势地图
查看>>
Python天天美味(11) - 可爱的大小写
查看>>
单链表
查看>>
WF4:AcitivityAction和ActivityFunc
查看>>
诺基亚S40手机联系人导入安卓手机
查看>>
JS魔法堂:再识Bitwise Operation & Bitwise Shift
查看>>