装饰者模式
定义
在原有对象的外部加上一层层的装饰品,并且装饰后的对象还是对于原来对象的类型。比如,一颗糖果,可以在外面包上很多层的糖果纸(红色的,橙色的,黄色的,绿色的等等),但是不管怎么装饰,糖果还是糖果。
类图
Component:一般是一个抽象类,抽象出了要修饰对象的一些基本特征
ConcreteComponent:继承了Component,被修饰对象的类型
Decorator:继承与Component,用来保证装饰后的类型还是原来的被修饰对象的类型
ConcreteDecorator:继承于Decorator,描述了具体的修饰,用来修饰ConcreteComponent。一般需要持有被装饰对象的引用,以便完成对原有对象的一些操作
例子
abstract class Role {
protected String name = "";
protected String equip = "";
public abstract String getDescription();
}
// 要装饰的对象类
class ConcreteRole extends Role {
public ConcreteRole(String s) {
name = s;
}
public String getDescription() {
return name;
}
}
// 保证修饰后的对象还是原对象的类型
abstract class EquipDes extends Role {
public abstract String getDescription();
}
//具体的一个修饰类
class Headwear extends EquipDes {
private Role role;
private String headwearName;
public Headwear(Role r, String h) {
role = r;
headwearName = h;
}
public String getDescription() {
return role.getDescription() + ", 头戴" + headwearName;
}
}
//具体的一个修饰类
class Weapon extends EquipDes {
private Role role;
private String weaponName;
public Weapon(Role r, String s) {
role = r;
weaponName = s;
}
public String getDescription() {
return role.getDescription() + ", 手握" + weaponName;
}
}
//具体的一个修饰类
class Costume extends EquipDes {
private Role role;
private String costumeName;
public Costume(Role r, String s) {
role = r;
costumeName = s;
}
public String getDescription() {
return role.getDescription() + ", 身穿" + costumeName;
}
}
//具体的一个修饰类
class Shoe extends EquipDes {
private Role role;
private String shoeName;
public Shoe(Role r, String s) {
role = r;
shoeName = s;
}
public String getDescription() {
return role.getDescription() + ", 脚踏" + shoeName;
}
}
public class DecoratorTest {
public static void main(String[] args) {
Role role = new ConcreteRole("孙悟空");
System.out.println(role.getDescription());
role = new Headwear(role, "凤翅紫金冠");
System.out.println(role.getDescription());
role = new Costume(role, "黄金锁子甲");
System.out.println(role.getDescription());
role = new Shoe(role, "藕丝步云履");
System.out.println(role.getDescription());
role = new Weapon(role, "如意金箍棒");
System.out.println(role.getDescription());
}
}
总的来说
装饰者模式就是在要装饰的对象外面加上一层层的装饰物,这些装饰物不会改变原来的对象内部信息,并且保证装饰后的对象还是原来对象所属的类型