<设计模式7>装饰模式

装饰模式是为了动态的添加一些功能,要求装饰对象和被装饰对象要实现同一个接口。

下面就举一个简单的例子。

我比较喜欢玩dota,现在就以dota来进行举例。

首先我们写一个接口:

<span style="font-size:18px;">public interface IRole {
	public String describe();
}</span>


实现这个接口用于对游戏人物进行具体描述:

<span style="font-size:18px;">public class RoleDecorator implements IRole {
	IRole role;
	
	public RoleDecorator(IRole role){
		this.role = role;
	}
	
	public String describe() {
		return role.describe();
	}

}</span>


RoleDecorator是业务的具体构建,继承该类的类应具有装饰者作用:

这个类ActorProperty调用父类的构造方法,同时动态的添加新的描述、功能。

public class ActorProperty extends RoleDecorator {
	String actor;
	
	public ActorProperty(IRole role,String actor) {
		super(role);
		this.actor = actor;
	}
	
	public String describe() {
		return super.describe() + " " +actor;
	}
}

我们写两个类简单的实现IRole接口,用于代表dota中的天灾、近位
<span style="font-size:18px;">public class Scourge implements IRole {

	public String describe() {
		return "天灾";
	}

}</span>
<span style="font-size:18px;">public class Sentinel implements IRole {

	public String describe() {
		return "近卫";
	}

}</span>

现在我们写一个测试类,创建一个游戏角色,并给他装备。

public class DecoratorTest {
	public static void main(String[] args) {
		IRole role = new ActorProperty(new ActorProperty(new Scourge(),"剑圣"), "圣剑");
		System.out.println(role.describe());
	}
}
结果:

天灾 剑圣 圣剑

一个角色的属性都创建出来了。

这样写的好处不知道大家感受到没。这个类可以动态的进行扩展。

说道扩展,继承不也可以扩展吗。但是大家发现没有,通过继承扩展,我们需要写很多的子类,一旦业务需求变得复杂,每次我们都得写一个不同的子类,而装饰者模式可以不需要重复的写子类,通过构造函数动态的进行扩展,这就是装饰者模式的好处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值