装饰模式是为了动态的添加一些功能,要求装饰对象和被装饰对象要实现同一个接口。
下面就举一个简单的例子。
我比较喜欢玩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());
}
}
结果:
天灾 剑圣 圣剑
一个角色的属性都创建出来了。
这样写的好处不知道大家感受到没。这个类可以动态的进行扩展。
说道扩展,继承不也可以扩展吗。但是大家发现没有,通过继承扩展,我们需要写很多的子类,一旦业务需求变得复杂,每次我们都得写一个不同的子类,而装饰者模式可以不需要重复的写子类,通过构造函数动态的进行扩展,这就是装饰者模式的好处。