設計模式(三)裝飾者模式Decorator

  裝飾者模式針對的問題是:對一個結構已經肯定的類,在不改變該類的結構的狀況下,動態增長一些功能。程序員

  通常來講,都是對一些已經寫好的架構增長本身的功能,或者應對多種狀況,增長功能。架構

  咱們仍是來玩一句紅警,首先咱們進入遊戲,這時咱們只有一個基地車,右邊的界面有個黑色的框,什麼操做也沒有。ide

  這裏,咱們假定有個操做的接口Operation函數

public interface Operation {
    //操做
    public void doOperation();
}

  咱們本身,叫作一個MyOperation,實現咱們的操做接口,說明咱們是能夠有操做的,但如今很迷茫,不知道幹啥。this

public class MyOperation implements Operation{

    @Override
    public void doOperation() {
        // TODO Auto-generated method stub
        System.out.println("該乾點啥");
    }
}

  玩過紅警的都知道,固然,沒玩過的我如今告訴你,紅警第一步,讓基地車打坐,這樣咱們纔會多出一些功能,纔有更多的操做去作。spa

  可是,咱們的MyOperation是已經寫好了的,不能遊戲每次有進展,都從新去改一遍代碼,可是爲了增長功能,因而程序員就想到了一個叫作裝飾者的模式來實現這個功能。code

  先搭建一個裝飾者的抽象類,其餘裝飾者繼承這個抽象類就能夠了。對象

  裝飾者 持有一個被裝飾的對象,都是操做,因此他們都實現Operation接口,而且增長了一個消耗金幣的函數blog

public abstract class DecoratorOperation implements Operation{
    public Operation operation;
    
    public DecoratorOperation(Operation operation){
        this.operation=operation;
    }
    
    @Override
    public void doOperation() {
        // TODO Auto-generated method stub
        operation.doOperation();
    }
    protected void consume(){
        
    }
}

  隨着遊戲進程,我麼多了一個兵營,有一個造美國大兵的操做了。因此聰明的程序員想到了加入一個裝飾者,增長這個功能。繼承

public class SoldierOperation extends DecoratorOperation{

    public SoldierOperation(Operation operation){
        super(operation);
    }
    @Override
    public void doOperation() {
        // TODO Auto-generated method stub
        operation.doOperation();
        makePanzer();
    }
    public void makePanzer(){
        System.out.println("開始製造美國大兵");
    }
    @Override
    protected void consume() {
        // TODO Auto-generated method stub
        System.out.println("花費了50金");
    }
}

  美國大兵站站底盤挖挖礦,又多了個戰車的功能

  

public class PanzerOperation extends DecoratorOperation{

    public PanzerOperation(Operation operation){
        super(operation);
    }
    @Override
    public void doOperation() {
        // TODO Auto-generated method stub
        operation.doOperation();
        makePanzer();
    }
    public void makePanzer(){
        System.out.println("開始製造坦克");
    }
    @Override
    protected void consume() {
        // TODO Auto-generated method stub
        System.out.println("花費了100金");
    }
}

  如今能夠試試了,原本迷茫度日的基地有事幹了

public class RedAlert {
    public static void main(String[] args) {
        MyOperation me=new MyOperation();
        me.doOperation();
        PanzerOperation panzer=new PanzerOperation(me);
        panzer.doOperation();
        SoldierOperation soldier=new SoldierOperation(me);
        soldier.doOperation();
    }
}

  

  甚至說,咱們的操做還能夠合二爲一,一塊兒作(裝飾者也是Operation 的實現類)

public class RedAlert {
    public static void main(String[] args) {
        MyOperation me=new MyOperation();
        me.doOperation();
        PanzerOperation panzer=new PanzerOperation(me);
        panzer.doOperation();
        SoldierOperation soldier=new SoldierOperation(panzer);
        soldier.doOperation();
    }
}

  

  思考與總結:

  1.Decorator裝飾者模式,添加功能用,通常在加入的新功能在特定的環境下用時,不便修改原來的代碼。

  2.能夠分開核心功能和裝飾的新功能,在不一樣場景用不一樣的裝飾,並且能夠有選擇有順序的包裝。

相關文章
相關標籤/搜索