设计模式之装饰者模式

首先看定义:

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

理解起来,就是添加业务嘛。

此模式,我们已角色扮演游戏为例:

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

具体需求:

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

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

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

先是准备装备的超类:

package 装饰者模式;
/**
 * 
 * 装备的接口
 * 
 * @author Administrator
 *
 */
public interface IEquip {
	/**
	 * 攻击力的计算
	 * @return
	 */
	public int caculateAttack();
	/**
	 * 装备的描述
	 * @return
	 */
	public String description();
}

然后就是各种装备:

package 装饰者模式;

public class ArmEquip implements IEquip {

	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		
		
		return 20;
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return "屠龙刀";
	}

}
package 装饰者模式;

public class RingEquip implements IEquip {

	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		return 5;
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return "麻痹戒指";
	}

}

package 装饰者模式;

public class ShoeEquip implements IEquip {

	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		return 5;
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return "圣战靴子";
	}

}

package 装饰者模式;

public class WristEquip implements IEquip {

	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		return 5;
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return "圣战护腕";
	}

}

然后就进入正轨:添加业务

package 装饰者模式;

public interface IEquipDecorator extends IEquip{

}
package 装饰者模式;
/**
 * 蓝宝石,每个宝石加5点攻击力
 * @author Administrator
 *
 */
public class BlueGemDecorator implements IEquipDecorator {
	/**
	 * 每个宝石只能维护一个装备
	 */
	private IEquip equip;
	
	public BlueGemDecorator(IEquip equip) {
		this.equip=equip;
	}
	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		
		return 5+equip.caculateAttack();
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return equip.description()+"装备了蓝宝石";
	}

}

package 装饰者模式;
/**
 * 红宝石,每个宝石加15点攻击力
 * @author Administrator
 *
 */
public class RedGemDecorator implements IEquipDecorator {
	/**
	 * 每个宝石只能维护一个装备
	 */
	private IEquip equip;
	
	public RedGemDecorator(IEquip equip) {
		this.equip=equip;
	}
	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		
		return 15+equip.caculateAttack();
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return equip.description()+"装备了红宝石";
	}

}

package 装饰者模式;
/**
 * 黄宝石,每个宝石加10点攻击力
 * @author Administrator
 *
 */
public class YellowGemDecorator implements IEquipDecorator {
	/**
	 * 每个宝石只能维护一个装备
	 */
	private IEquip equip;
	
	public YellowGemDecorator(IEquip equip) {
		this.equip=equip;
	}
	@Override
	public int caculateAttack() {
		// TODO Auto-generated method stub
		
		return 10+equip.caculateAttack();
	}

	@Override
	public String description() {
		// TODO Auto-generated method stub
		return equip.description()+"装备了黄宝石";
	}

}

最后进行测试:

package 装饰者模式;

public class test {
	public static void main(String[] args) {
		// 一个镶嵌2颗红宝石,1颗蓝宝石的靴子
		System.out.println(" 一个镶嵌2颗红宝石,1颗蓝宝石的靴子");
		IEquip equip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip())));
		System.out.println("攻击力  : " + equip.caculateAttack());
		System.out.println("描述 :" + equip.description());
		System.out.println("-------");
		// 一个镶嵌1颗红宝石,1颗蓝宝石的武器
		System.out.println(" 一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的武器");
		equip = new RedGemDecorator(new BlueGemDecorator(new YellowGemDecorator(new ArmEquip())));
		System.out.println("攻击力  : " + equip.caculateAttack());
		System.out.println("描述 :" + equip.description());
		System.out.println("-------");
	}
}
装饰者模式代码完毕


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值