所谓装饰,就是在原有物件上增加新的“零件”,使其拥有新的功能。打个比方,就像一个原本裸装的初级剑客,装备了宝剑、坐骑、铠甲等装备之后,战斗力暴增,完成从原来的5剑砍死一头家养猪到一剑秒杀巨龙的华丽转身。
装饰模式是为已有功能动态的添加更多功能的一种方式。它把每个要装饰的功能放到单独的类中,并让这个类包装它所要装饰的对象,当系统需要执行特殊行为时,客户就可有选择的、按顺序的使用装饰功能包装对象了。 --摘自《大话设计模式》
基本结构如下:
①、原型,核心代码(裸装剑客)
方法甲:需要被扩展的方法
②、装饰抽象类,装饰的超类,继承“原型”对其扩展(装备)
原型的引用ob
装饰方法:为“原型的引用”初始化的方法
方法乙:要覆写原型方法(调用“ob”的方法甲)
③、各种装饰类,继承装饰抽象类(宝剑、坐骑、铠甲等)
覆写“装饰抽象类”里的方法乙,加入各自的实现
④、调用者
new出初级裸装剑客
new出装备1,装备2……
用装备1装饰剑客,用装备2装饰“已佩戴装备1的剑客”……(/*装饰方法*/调用)
装备完全的剑客,调用最终版本的方法乙
示例代码:模拟给人物上装备
①、原型#########################################
/**
* 原型
*/
public class Person {
private String figure;//人物
public Person(){};
public Person(String figure){
this.figure = figure;
}
//展示方法
public void show(){
System.out.print("\t装备的"+figure);
}
}
②、装饰抽象类#########################################
/**
* 装饰抽象类,装备的超类
*/
public abstract class Equipment extends Person {
private Person person; //Person的引用
//装饰方法,为传入的target增加装备
public void decorate(Person target){
this.person = target;
}
@Override
public void show() {
if(person!=null){
person.show();
}
}
}
③、各种装饰类#########################################
/**
* 装备一,宝剑
*/
public class Sword extends Equipment {
@Override
public void show() {
System.out.print("\t轩辕剑");
super.show();
}
}
/**
* 装备二、铠甲
*/
public class Armour extends Equipment {
@Override
public void show() {
System.out.print("\t玄武战甲");
super.show();
}
}
/**
* 装备三、坐骑
*/
public class Horse extends Equipment {
@Override
public void show() {
System.out.print("\t饕餮");
super.show();
}
}
④、调用者#########################################
public class Test {
public static void main(String[] args) throws Exception {
Person person = new Person("剑客"); //人物原型
Sword sword = new Sword(); //准备宝剑
Armour armour = new Armour(); //准备铠甲
Horse horse = new Horse(); //准备坐骑
sword.decorate(person); //给“剑客”装备宝剑
armour.decorate(sword); //给“佩戴宝剑的剑客”装备铠甲
horse.decorate(armour); //给“身着铠甲佩戴宝剑的剑客”装备坐骑
System.out.println("人物展示:");
horse.show(); //展示方法
}
}