設計模式之裝飾模式

裝飾模式主要是爲了擴展被裝飾類的功能,而且是動態的.裝飾類中需要注入被裝飾對象,且裝飾類和被裝飾類都需要實現同一個接口.

裝飾模式步驟如下:

  1. 編寫一個類,實現與被裝飾的類相同的接口,目的是使他們有相同的行爲
  2. 定義一個實例變量,引用被裝飾對象,目的和原來的老對象進行交接
  3. 定義構造方法,把被裝飾對象注入進來(也可以使用其他方式注入)
  4. 對於不需要改寫的方法,調用被裝飾對象的.
  5. 對於要改寫的方法,改寫即可

裝飾類和被裝飾類實現同一個接口

package design.decorator;

/**
 * 裝飾類和被裝飾的類都會實現這個接口
 * 
 * @author Minhellic
 *
 */
public interface Sourcable {
    /**
     * 演示在裝飾類中重寫這個方法
     */
    public void method_1();
    /**
     * 演示在裝飾類中直接調用被裝飾類的方法
     */
    public void method_2();
}

被裝飾的類

package design.decorator;

/**
 * 被裝飾的類
 * @author Minhellic
 *
 */
public class Source implements Sourcable {
    @Override
    public void method_1() {
        System.out.println("Source.method_1 ...");
    }

    @Override
    public void method_2() {
        System.out.println("Source.method_2 ...");      
    }

}

裝飾類

package design.decorator;

/**
 * 裝飾類,實現和被裝飾類同樣的接口
 * 改寫需要改寫的方法,對於不需要改寫的方法,直接調用注入的被包裝類的方法
 * @author Minhellic
 *
 */
public class Decorator implements Sourcable {
    //定義被包裝類的實例,以便調用其中的方法
    private Source source;
    //通過構造方法將被包裝類注入進裝飾類
    public Decorator(Source source) {
        this.source = source;
    }

    /**
     * 在裝飾類中,改寫這個方法
     */
    @Override
    public void method_1() {
        System.out.println("Decorator.method_1 ...");

    }

    /**
     * 在裝飾類中,調用被裝飾類的方法
     */
    @Override
    public void method_2() {
        source.method_2();
    }

}

測試類

package design.test;

import design.decorator.Decorator;
import design.decorator.Sourcable;
import design.decorator.Source;

public class Test {
    public static void main(String[] args) {
        /*
         * 創建接口的實例對象時,使用的是裝飾類的實例,
         * 使用構造方法將被裝飾類注入進去
         */
        Sourcable decorator = new Decorator(new Source());

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