java设计模式之装饰模式

定义:

      动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。

设计初衷:

     通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

关系图如下:


Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:

package com.deppon.tps.module.TestDecoratorPattern;
public interface Sourceable {
	public void method();
}
package com.deppon.tps.module.TestDecoratorPattern;
public class Source implements Sourceable {
	@Override
	public void method() {
		 System.out.println("这是原始方法");  
	}
}

package com.deppon.tps.module.TestDecoratorPattern;
public class Decorator implements Sourceable{
	private Source sourceable;
	public  Decorator(Source sourceable){
		super();
		this.sourceable=sourceable;
	}
	@Override
	public void method() {
		System.out.println("before decorator!");  
		sourceable.method();
		System.out.println("after decorator!");  
	}
}

package com.deppon.tps.module.TestDecoratorPattern;

public class Test {
	public static void main(String[] arg){
		Decorator decorator=new Decorator(new Source());
		decorator.method();
	}
}

二、下面通过一个家庭成员吃饭的例子来说明装饰模式的使用
过程是这样的:
家庭成员到点吃饭
家庭成员到点吃饭后,先做些前期的工作(比如端洗手、菜饭),然后再吃饭,吃完饭后,家庭成员再收拾碗。代码如下:
package com.deppon.tps.module.TestDecoratorPattern.example;
public interface Meal {
	//吃饭
	void doHave();
}
package com.deppon.tps.module.TestDecoratorPattern.example;
public class Person implements Meal{
	//在吃饭
	@Override
	public void doHave() {
		System.out.println("在吃饭啦。。。。");
	}
}
package com.deppon.tps.module.TestDecoratorPattern.example;
/**
 * 家庭成员
 * @author 284724
 *
 */
public class MyHousePerson implements Meal{
	private Meal meal;
	public MyHousePerson( Meal meal){
		this.meal=meal;
	}
	//吃饭
	@Override
	public void doHave() {
		startHaveDinner();
	}
	//就餐开始
	public void startHaveDinner(){
		startHaveMeal();
		meal.doHave();
		endHaveMeal();
	}
	//开始吃饭做的事
	public void startHaveMeal(){
		
	}
	//结束吃饭做的事
	public void endHaveMeal(){
		
	}
}

package com.deppon.tps.module.TestDecoratorPattern.example;
public class MyHouseZhangSan extends MyHousePerson{
	public MyHouseZhangSan(Meal meal) {
		super(meal);
		// TODO Auto-generated constructor stub
	}
	//家庭成员张三 吃饭前做的事
	public void startHaveMeal(){
		System.out.println("家庭成员张三:洗手。。。");
		System.out.println("家庭成员张三:将菜饭端上桌子。。。");
	}
}
package com.deppon.tps.module.TestDecoratorPattern.example;
public class MyHouseLisi extends MyHousePerson{
	public MyHouseLisi(Meal meal) {
		super(meal);
		// TODO Auto-generated constructor stub
	}
	//家庭成员李四 吃饭前做的事
	public void startHaveMeal(){
		System.out.println("家庭成员李四:洗手。。。");
		System.out.println("家庭成员李四:将菜饭端上桌子。。。");
	}
	//家庭成员李四 吃饭后做的事
	public void endHaveMeal(){
		System.out.println("家庭成员李四:收拾碗筷子。。。");
		System.out.println("家庭成员李四:负责洗碗。。。");
	}
}

package com.deppon.tps.module.TestDecoratorPattern.example;
public class Test {
	public static void main(String[] args) {
		Meal person=new Person();
		MyHouseZhangSan myHouseZhangSan=new MyHouseZhangSan(person);
		myHouseZhangSan.doHave();
		MyHouseLisi myHouseLisi=new MyHouseLisi(person);
		myHouseLisi.doHave();
	}
}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值