定义:
动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用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();
}
}