1. 程式人生 > >java常用設計模式10—裝飾模式

java常用設計模式10—裝飾模式

我的設計模式學習系列專案地址:

GitHub - GodisGod/DesignPatternStudy: 設計模式學習demo
https://github.com/GodisGod/DesignPatternStudy

介紹:
裝飾模式也稱為包裝模式,結構型設計模式之一。

基本框架:
1、需要一個抽象方法類
2、需要一個抽象裝飾器類
3、建立裝飾器

程式碼示例:

1、建立抽象方法類和具體實現類
/**
 * 抽象方法類
 */
public abstract class Component {
    /**
     * 抽象方法
     */
    public
abstract void operate(); } /** * 未經裝飾的元件實現類 */ public class ConcreteComponent extends Component { @Override public void operate() { //具體邏輯 Log.i("LHD", "元件具體邏輯"); } }
2、然後建立抽象裝飾器類和具體裝飾器類
/**
 * 裝飾器抽象類
 */
public class Decorator extends Component {
    private Component component;
//持有一個Component物件的引用 /** * 將Component物件傳給裝飾器 * * @param component */ public Decorator(Component component) { this.component = component; } @Override public void operate() { //呼叫元件的具體方法 component.operate(); } } /** * 具體裝飾器A */ public class
RealDecoratorA extends Decorator { /** * 將Component物件傳給裝飾器 * * @param component */ public RealDecoratorA(Component component) { super(component); } @Override public void operate() { operate1();//裝飾方法可以在父類方法之前呼叫也可以在之後呼叫 super.operate();//呼叫具體的元件方法 operate2(); } /** * 裝飾方法1 */ private void operate1() { Log.i("LHD", "A裝飾器1"); } /** * 裝飾方法2 */ private void operate2() { Log.i("LHD", "A裝飾器2"); } } /** * 具體裝飾器B */ public class RealDecoratorB extends Decorator { /** * 將Component物件傳給裝飾器 * * @param component */ public RealDecoratorB(Component component) { super(component); } @Override public void operate() { operate1();//裝飾方法可以在父類方法之前呼叫也可以在之後呼叫 super.operate(); operate2(); } /** * 裝飾方法1 */ private void operate1() { Log.i("LHD","B裝飾器1"); } /** * 裝飾方法2 */ private void operate2() { Log.i("LHD","B裝飾器2"); } }
3、我們建立了兩個裝飾器A和B,接下來我們使用裝飾器裝飾元件
                //構造需要被裝飾的元件物件
                Component component = new ConcreteComponent();
                //構造裝飾器A,呼叫裝飾器A的方法裝飾元件物件
                RealDecoratorA realDecoratorA = new RealDecoratorA(component);
                realDecoratorA.operate();
                //構造裝飾器B,呼叫裝飾器B的方法裝飾元件物件
                RealDecoratorB realDecoratorB = new RealDecoratorB(component);
                realDecoratorB.operate();

檢視輸出:
decorator
可以看到裝飾器的原理就是把要裝飾的物件傳給裝飾器,然後裝飾器內部呼叫一些裝飾方法。如果裝飾器需要操作Component物件,只需要將裝飾器抽象類的private Component component;改為public Component component;即可。此處不再示例。

然後我們看一個具體的裝飾器的使用例子:
汽車工廠生產汽車,寶馬和法拉利的生產流程並不相同,我們用裝飾器模式實現這個場景。

1、建立生產汽車的抽象類和生產汽車的實現類
/**
 * 抽象方法類
 */
public abstract class Component {
    /**
     * 抽象方法
     */
    public abstract void operate();
}
/**
 * 未經裝飾的汽車工廠
 */
public class CarFactory extends Component {

    @Override
    public void operate() {
        Log.i("LHD", "安裝汽車發動機");
    }

}
2、建立抽象車廠裝飾類和具體的寶馬車廠和法拉利車廠
/**
 * 抽象車廠裝飾類
 */
public class FactoryDecorator extends Component{
    //保持一個基本元件的引用
    protected Component component;

    public FactoryDecorator(Component component) {
        this.component = component;
    }

    @Override
    public void operate() {
        //呼叫基本元件的方法
        component.operate();
    }

}
/**
 * 寶馬車汽車廠
 */
public class BMW extends FactoryDecorator {

    public BMW(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        installCarTyre();//安裝車標
        super.operate();//安裝發動機
        installCarLogo();//安裝汽車logo
    }

    /**
     * 安裝車標
     */
    private void installCarLogo() {
        Log.i("LHD", "安裝寶馬車標");
    }

    /**
     * 安裝輪胎
     */
    private void installCarTyre() {
        Log.i("LHD", "安裝寶馬車輪胎");
    }

}
/**
 * 法拉利裝飾器
 */
public class Ferrari extends FactoryDecorator{

    public Ferrari(Component component) {
        super(component);
    }

    @Override
    public void operate() {
        super.operate();//安裝發動機
        installCarLogo();//安裝汽車logo
        installCarTyre();//安裝車標
    }

    /**
     * 安裝車標
     */
    private void installCarLogo() {
        Log.i("LHD", "安裝法拉利車標");
    }

    /**
     * 安裝輪胎
     */
    private void installCarTyre() {
        Log.i("LHD", "安裝法拉利輪胎");
    }

}
好啦!接下來我們就可以生產汽車啦 (^ ▽ ^)
                //安裝上汽車發動機了
                CarFactory carFactory = new CarFactory();
                //讓寶馬車廠加工
                BMW bmw = new BMW(carFactory);
                bmw.operate();
                //或者讓法拉利車廠加工
                Log.i("LHD","--------------法拉利車廠--------------");
                Ferrari ferrari = new Ferrari(carFactory);
                ferrari.operate();

執行輸出:
decorator

可以看到輸出和我們預先設計的一樣呢,以上就是裝飾模式的簡單介紹啦! (^ ▽ ^)