1.什么是装饰模式?
动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活。装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能,通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取,在面向对象的设计中,我们应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合方式,可以很灵活的给对象添加所需的功能,装饰器模式的本质就是动态组合,动态是手段,组合才是目的,总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式,他使得我们可以给某个对象而不是整个类添加一些功能。
2.需求游戏中有不同的角色,然后不同的角色有不同的搭配,这里创建两个角色法师和猎人,对他们进行装饰穿衣服,穿裤子,装饰头发等等。
描述信息的接口RoleDescription:
public interface RoleDescription {
public String describe();//描述角色信息
}
所有具体装饰类的父类AbstractDecorate是一个抽象类:
//所有具体装饰类的父类
public abstract class AbstractDecorate implements RoleDescription{
//持有被装饰者实现的接口的引用
private RoleDescription rd;
public AbstractDecorate(RoleDescription rd) {
this.rd=rd;
}
public String describe() {
return rd.describe();
}
}
穿裤子的实现类PlantDecoration:
public class PlantDecoration extends AbstractDecorate{
public PlantDecoration(RoleDescription rd) {
super(rd);
}
public String describe() {
return super.describe()+"穿上了裤子";
}
}
穿上衣的实现类JacketDecoration:
public class JacketDecoration extends AbstractDecorate{
public JacketDecoration(RoleDescription rd) {
super(rd);
}
public String describe() {
return super.describe()+"穿上了上衣";
}
}
创建法师角色的类Magic:
public class Magic implements RoleDescription{
@Override
public String describe() {
return "法师";
}
}
创建猎人角色的类Hunter:
public class Hunter implements RoleDescription{
@Override
public String describe() {
return "猎人";
}
}
测试类TestDecoration:
public class TestDecoration {
public static void main(String[] args) {
RoleDescription rd=new Magic();
System.out.println(rd.describe());
//穿上衣
JacketDecoration jacketDecoration=new JacketDecoration(rd);
String result=jacketDecoration.describe();
System.out.println(result);
//穿鞋子
PlantDecoration plantDecoration=new PlantDecoration(jacketDecoration);
result=plantDecoration.describe();
System.out.println(result);
//装饰一个猎人
System.out.println("----------------");
RoleDescription target=new PlantDecoration(new JacketDecoration(new HairDecoration(new Hunter())));
System.out.println(target.describe());
}
}