java設計模式(結構型)之裝飾模式

第0章:簡介

裝飾模式定義:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式比生成子類更爲靈活

裝飾模式本質:動態組合

參考:http://chjavach.iteye.com/blog/767739  ,研磨設計模式(書籍),大話設計模式(書籍)

模式圖:

待補充


第1章:實踐

(1)組件對象的接口(Component.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 組件對象的接口,可以給這些對象動態地添加職責
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-13  下午11:44
 */
public abstract class Component {

    public abstract void someMethod();
}

(2)組件對象接口的具體實現對象A(ComponentExtendsA)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 組件對象接口的具體實現對象A,被裝飾的對象
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-13  下午11:50
 */
public class ComponentExtendsA extends Component {
    @Override
    public void someMethod() {
        System.out.println("組件對象具體實現對象A的方法");
    }
}

(3)組件對象接口的具體實現對象B(ComponentExtendsB.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 組件對象接口的具體實現對象B,被裝飾的對象
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-13  下午11:54
 */
public class ComponentExtendsB extends Component {
    @Override
    public void someMethod() {
        System.out.println("組件對象具體實現對象B的方法");
    }
}

(4)裝飾器的接口(Decorator.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 裝飾器的接口,維持一個指向組件對象的接口對象,自身也是組件對象的子類
 *
 * 裝飾模式的定義:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式比生成子類更爲靈活
 * 裝飾模式的本質:動態組合
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-13  下午11:55
 */
public abstract class Decorator extends Component {

    //持有組件對象
    protected Component component;

    /**
     * 構造器,傳入組件對象,對象來自裝飾器具體實現對象
     * @param component
     */
    public Decorator(Component component){
        this.component = component;
    }

    @Override
    public void someMethod(){
        System.out.println("轉發前可以附加操作");
        //轉發請求給組件對象
        component.someMethod();
        System.out.println("轉發後可以附加操作");
    }

}

(5)裝飾器具體實現類A(DecoratorExtendsA.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 裝飾器具體實現類A
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-14  上午12:05
 */
public class DecoratorExtendsA extends Decorator {
    /**
     * 構造器,傳入組件對象,對象來自裝飾器具體實現對象
     *
     * @param component
     */
    public DecoratorExtendsA(Component component) {
        super(component);
    }

    @Override
    public void someMethod() {
        System.out.println("裝飾器A調用父類方法前操作");
        //調用方法,這裏可以向組件對象添加職責
        super.someMethod();
        System.out.println("裝飾器A調用父類方法後操作");
    }
}

(6)裝飾器具體實現類B(DecoratorExtendsB.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 裝飾器具體實現類B
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-14  上午12:10
 */
public class DecoratorExtendsB extends Decorator {
    /**
     * 構造器,傳入組件對象,對象來自裝飾器具體實現對象
     *
     * @param component
     */
    public DecoratorExtendsB(Component component) {
        super(component);
    }

    @Override
    public void someMethod() {
        System.out.println("裝飾器B調用父類方法前操作");
        //調用方法,這裏可以向組件對象添加職責
        super.someMethod();
        System.out.println("裝飾器B調用父類方法後操作");
    }
}

(7)客戶端測試(Client.java)

package com.mcc.core.designPattern.structure.decorator;

/**
 * 客戶端測試
 *
 * @author <a href="mailto:[email protected]">menergy</a>
 *         DateTime: 14-3-14  上午12:15
 */
public class Client {

    public static void main(String args[]){
        //被裝飾的對象
        Component componentA = new ComponentExtendsA();
        Component componentB = new ComponentExtendsB();

        System.out.println("\n裝飾器A裝飾被裝飾對象A:\n");
        Decorator decoratorAA = new DecoratorExtendsA(componentA);
        decoratorAA.someMethod();

        System.out.println("\n裝飾器A裝飾被裝飾對象B:\n");
        Decorator decoratorAB = new DecoratorExtendsA(componentB);
        decoratorAB.someMethod();

        System.out.println("\n裝飾器B裝飾被裝飾對象A:\n");
        Decorator decoratorBA = new DecoratorExtendsB(componentA);
        decoratorBA.someMethod();

        System.out.println("\n裝飾器B裝飾被裝飾對象B:\n");
        Decorator decoratorBB = new DecoratorExtendsB(componentB);
        decoratorBB.someMethod();

    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章