装饰者模式是什么?
装饰者模式顾名思义就是装饰被装饰者的模式,比如装饰圣诞树。
举例:暖暖系列的换装游戏
暖暖要换装,要挂很多东西,而暖暖有不同打扮然后进行打扮评分,如果正常来讲要创建很多物品类,也就是由暖暖来调用很多个物品类加人上。这样太过麻烦,就相当于把所有的装扮都扔在一起让暖暖挑。而打扮评分也得一个一个调用加上去。
但装饰者模式就不一样,它更倾向于组合而不是继承。但它比较重要的一点就是装饰者都有一个共同的超类,这样才能使装饰者覆盖被装饰者,达到装饰的目的。简单来说相当于自定义套装形式出现。
这样的好处在于:
装饰类和被装饰类不互相耦合,可各自独立发展,可动态扩展。
实际简单例子的代码:
结构示意图:
1.首先的创建源类,注意抽象abstract
//一切的基础装扮源
public abstract class attire {
String description="未知装扮";
//装扮描述
public String getDescription(){
return description;
}
//装扮分数
public abstract int score();
}
2.创建第一层装扮-衣服
//衣服-红色长裙
public class redlonguette extends attire {
public redlonguette(){
description="红色长裙";
}
@Override
public int score() {
return 50;
}
}
3.创建第二层装扮-化妆
//化妆
public abstract class makeup extends attire {
public abstract String getDescription();
}
//腮红
public class makeup_rouge extends makeup {
//被装饰者
attire attire;
//将继承的被装饰者对象赋值给当前的被装饰者
public makeup_rouge(attire attire){
this.attire=attire;
}
@Override
public String getDescription() {
return attire.getDescription() + "+腮红";
}
@Override
public int score() {
return 5+attire.score();
}
}
//白色眉毛
public class makeup_whiteEyebrow extends makeup {
//被装饰者
attire attire;
//将继承的被装饰者对象赋值给当前的被装饰者
public makeup_whiteEyebrow(attire attire){
this.attire=attire;
}
@Override
public String getDescription() {
return attire.getDescription() + "+白色眉毛";
}
@Override
public int score() {
return 11+attire.score();
}
}
4.实际调用测试
//装饰者模式
public class DecoratorPattern {
public static void main(String[] args) {
//不添加化妆,只衣服
attire attireTest=new redlonguette();
System.out.println("不添加化妆,只用衣服");
System.out.println("描述:"+attireTest.getDescription());
System.out.println("分数:"+attireTest.score()+"分");
//衣服+化妆
attire attireTest2=new redlonguette();
attireTest2 = new makeup_whiteEyebrow(attireTest2);
attireTest2 = new makeup_rouge(attireTest2);
System.out.println("衣服基础上添加2种化妆");
System.out.println("描述:"+attireTest2.getDescription());
System.out.println("分数:"+attireTest2.score()+"分");
}
}