装饰者模式

定义

在原有对象的外部加上一层层的装饰品,并且装饰后的对象还是对于原来对象的类型。比如,一颗糖果,可以在外面包上很多层的糖果纸(红色的,橙色的,黄色的,绿色的等等),但是不管怎么装饰,糖果还是糖果。


类图

description


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());

	}
}

总的来说

装饰者模式就是在要装饰的对象外面加上一层层的装饰物,这些装饰物不会改变原来的对象内部信息,并且保证装饰后的对象还是原来对象所属的类型


posted @ 2018-05-10 16:42  _weirdly  阅读(91)  评论(0编辑  收藏  举报