前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >装饰者模式

装饰者模式

作者头像
付威
发布2018-12-05 11:32:30
6570
发布2018-12-05 11:32:30
举报

在23种设计模式中,装饰者模式在游戏开发的过程中,使用的很是频繁。因为这个设计模式,把所有的业务的逻辑封装的对应的实体类中,从而为主流程减负了。首先看下一个应用场景

装饰者模式的应用

我们都知道有一款经典游戏90坦克,这个游戏中,玩家坦克来操作坦克打击AI敌人,在没打死一个红色坦克就会掉下来一个装备,这个装备可以提升移动速度,增加攻击力。

我们首先定义玩家坦克是player对象,再定义几个特别的装备,增加速度,增加生命,增加攻击力。对于这个场景,可以定制一下几个方法:

代码语言:javascript
复制
 void addSpeed(Player player);
 void addLife(Player player);
 void addAttack(Player player);

这个方法定下来,就可以设计我们的程序,怎么设计呢? 我们可以设计一个最简单的设计,写一个静态的帮助类,代码实现如下:

代码语言:javascript
复制
public class EquipmentHelper{
	 public void addSpeed(Player player){

	 }
    public void addLife(Player player){

    }
    public  void addAttack(Player player){

    }

}

这个写完之后,我们们觉是可以实现我们的功能的?但是我们在条用的时候,是不是判断的逻辑比较多?如果类型比较多的时候,我们的系统就很难再维护了。

代码语言:javascript
复制
if(equipment is Speed){
	equipmentHelper.addSpeed(player);
}
if(equipment is Life){
	equipmentHelper.addLife(player);
}
....

这个一看,这样做问题出在哪里? 这个破坏了我们的player的对象,违反了OOP中的“对扩展开放,对修改关闭”的原则。

对于这个问题,我们可以用多态的方法进行,把需要抽象一个装备的基类,在基类中只有一个方法addProperty,然后就子类可以自己实现的装饰方法。整个装备类的实现如下:

装饰者模式
装饰者模式

然后我们再调用的时候就省了if逻辑的判断:

代码语言:javascript
复制
public void equip(BaseEquipment equipment){
	equipment.addProperty(player);
}

我们对上面的方法在进行优化,就是我们今天说的装饰者模式。

装饰者实现流程图

装饰者模式
装饰者模式

装饰者实现逻辑

经过上面的分析,我们可以使用代码来表示我们的设计。

代码语言:javascript
复制
public abstract class Element {
	public abstract String getEquipment();
}

public class Tank extends Element {
	@Override
	public String getEquipment() {
		return "我是一辆坦克";
	}
}

public abstract class BaseEquipment  extends Element{
 
}


public class AttackEquipment extends BaseEquipment {
	private Element element;
	public AttackEquipment(Element element){
		this.element=element;
	}
	@Override
	public String getEquipment() {
		return element.getEquipment()+",增加攻击力";
	}
}

public class SpeedEquipment extends BaseEquipment{
	private Element element;
	public SpeedEquipment(Element element){
		this.element=element;
	}
	@Override
	public String getEquipment() {
		return element.getEquipment()+",增加速度";
	}
}


public class LifeEquipment extends BaseEquipment{
	private Element element;
	public LifeEquipment(Element element){
		this.element=element;
	}
	@Override
	public String getEquipment() {
		return element.getEquipment()+",增加生命";
	}
}

在最终的调用的时候,我们需要什么装备,就可以直接使用。调用如下:

代码语言:javascript
复制
Element tank = new Tank();
tank = new LifeEquipment(tank);
tank = new AttackEquipment(tank);
tank = new SpeedEquipment(tank);
System.out.println(tank.getEquipment());

运行结果:

代码语言:javascript
复制
我是一辆坦克,增加生命,增加攻击力,增加速度

java中的装饰者模式的使用

在java 中,IO的实现逻辑就是装饰者模式 ,首先看下IO的逻辑类图:

装饰者模式
装饰者模式
代码语言:javascript
复制
 InputStream dataStream = ClassLoader.getSystemResourceAsStream("");
 dataStream = new BufferedInputStream(dataStream);
 dataStream = new DataInputStream(dataStream);
 dataStream = new LineNumberInputStream(dataStream);

对于java中的IO缺点也有,会生成很多的小类,导致调用的时候不知道怎么去使用。知道了装饰者模式,我们就可以更好的使用IO的类。

(本文完)

作者:老付 如果觉得对您有帮助,可以下方的订阅,或者选择右侧捐赠作者,如果有问题,请在捐赠后咨询,谢谢合作 如有任何知识产权、版权问题或理论错误,还请指正。 自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828:点击加群 或发我邮件 laofu_online@163.com

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 装饰者模式的应用
  • 装饰者实现流程图
  • 装饰者实现逻辑
  • java中的装饰者模式的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档