四、装饰模式

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值