四、装饰模式

来源:互联网 发布:evdo是什么网络 编辑:程序博客网 时间:2024/06/05 06:08

 所谓装饰,就是在原有物件上增加新的“零件”,使其拥有新的功能。打个比方,就像一个原本裸装的初级剑客,装备了宝剑、坐骑、铠甲等装备之后,战斗力暴增,完成从原来的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;}@Overridepublic void show() {if(person!=null){person.show();}}}


 ③、各种装饰类#########################################

/** *装备一,宝剑  */public class Sword extends Equipment {@Overridepublic void show() {System.out.print("\t轩辕剑");super.show();}}


 

/** *装备二、铠甲  */public class Armour extends Equipment {@Overridepublic void show() {System.out.print("\t玄武战甲");super.show();}}


 

/** *装备三、坐骑  */public class Horse extends Equipment {@Overridepublic 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(); //展示方法}}