java的設計模式(裝飾模式)

簡言:

Java中的23種設計模式:

Factory(工廠模式),Singleton(單例模式),Adapter(適配器模式),FactoryMethod(工廠方法模式),Prototype(原始模型模式),Facade(門面模式),Bridge(橋樑模式),Composite(合成模式),Builder(建造模式),Decorator(裝飾模式),Flyweight(享元模式),Proxy(代理模式),Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),TemplateMethod(模板方法模式),ChainOfResponsibleity(責任鏈模式)

我們在開發中都會用到哪些設計模式呢?

每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重複相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。

今天我們主要講的是裝飾模式

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

裝飾模式的結構圖(網上查找的,流程關係比較詳細)

1) Component定義一個對象接口,可以給對象動態的添加職責

2)ConcreteComponent 定義了一個具體的對象,可以給對象添加一些職責

3) Decorator :裝飾抽象類。繼承Component類並擴展功能,

4) ConcreteDecorator :具體的裝飾對象

 

我們通過一個案例與代碼的配合講解裝飾模式

案例講解:小草要去相親,如何搭配自己的穿搭,讓她相親的女神相中自己:

1)定義抽象類(Person)爲了展示給女神

public abstract class Person {

    public abstract void show();
}

2)定義Compinent類繼承Person(介紹小草的風格)

public class Component extends Person {
    @Override
    public void show() {
        System.out.println("小草的風格");
    }
}

3) 定義一個Finery類 繼承自ComPinent類(如何的裝扮自己讓女神愛上自己)

public class Finery extends Component {

    private Component component;

    /**
     * 裝扮自己

       設置 Component
     * */
    public void DecoratorMy(Component components){
        this.component = components;
    }


    // 重寫show() 實際執行的是Person的show();
    @Override
    public void show() {
        if(component != null){
            component.show();
        }
    }
}

4)各種的穿衣風格

class DustCoat extends Finery{

    @Override
    public void show() {
        super.show();
        System.out.println("風衣");
    }
}


public class fleece extends Finery{

    @Override
    public void show() {
        super.show();
        System.out.println("衛衣");
    }
}

public  class shirt extends Finery{
    @Override
    public void show() {
        super.show();
        System.out.println("襯衫");
    }
}


class Tshirts extends Finery{
    @Override
    public void show() {
        super.show();
        System.out.println("T恤");
    }
}

public  class Western extends Finery{
    @Override
    public void show() {
        super.show();
        System.out.println("西服");
    }
}

5)展示給女神(客戶端實現)

    public static void main(String[] args) {
        System.out.println("\n第一種裝扮");
        Component person = new Component();
        HipHop hipHop = new HipHop();
        fleece fleece = new fleece();
        hipHop.DecoratorMy(person);
        fleece.DecoratorMy(hipHop);
        fleece.show();
        System.out.println("\n第二種裝扮");

        Western western = new Western();
        shirt shirt = new shirt();
        DustCoat dustCoat = new DustCoat();
        western.DecoratorMy(person);
        shirt.DecoratorMy(western);
        dustCoat.DecoratorMy(shirt);
        dustCoat.show();
    }

6)相親成功 顯示結果

案例中:裝飾模式是利用

對對象進行包裝的,這樣每個裝飾對象的實現就和如何使用這個對象分離了,每個裝飾對象關係的是自己的功能。不需要關係如何被添加到對象連當中;

如果只有一個ConcreteCompinent類沒有抽象的Compinent類,nameDecorator類可以使ConcreteComponent的一個子類,同樣道如果只有一個ConcreteDecorator類,那麼久沒有必要建立一個單獨的Decorator類,而可以把Decorartor和ConceteDecorator的責任合併成一個類

裝飾模式的總結:

裝飾模式是爲了已有功能動態的添加更多功能的一種方式,當系統需要新功能的時候,向就得類中添加新的代碼,這些新的代碼通常裝飾了原有類的核心職責,裝飾模式是提供了一個非常好的解決方案,把每個要裝飾的功能放在單獨的類中,並讓這個類包裝她所要裝飾的對象,在需要特殊行爲時,客戶端代碼就可以運行時根據需要選擇的使用裝飾功能包裝對象了

裝飾模式的優點:

優點:把類中的裝飾功能從類中移除,這樣簡化原有的類,有限地把累的核心職責和裝飾功能分離。並去除相關的重複裝飾邏輯,

 

 

 

 

 

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