裝飾模式主要是爲了擴展被裝飾類的功能,而且是動態的.裝飾類中需要注入被裝飾對象,且裝飾類和被裝飾類都需要實現同一個接口.
裝飾模式步驟如下:
- 編寫一個類,實現與被裝飾的類相同的接口,目的是使他們有相同的行爲
- 定義一個實例變量,引用被裝飾對象,目的和原來的老對象進行交接
- 定義構造方法,把被裝飾對象注入進來(也可以使用其他方式注入)
- 對於不需要改寫的方法,調用被裝飾對象的.
- 對於要改寫的方法,改寫即可
裝飾類和被裝飾類實現同一個接口
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();
}
}