Java設計模式之裝飾設計模式

1 . 裝飾設計模式概述

      裝飾模式就是使用被裝飾類的一個子類的實例,在客戶端將這個子類的實例交給裝飾類。是繼承的替代方案。

2 . 裝飾設計模式的優點

    使用裝飾模式,可以提供比繼承更靈活的擴展對象的功能,它可以動態的添加對象的功能,並且可以隨意的組合這些功能。

3 . 裝飾設計模式缺點

    正因爲可以隨意組合,所以就可能出現一些不合理的邏輯

4 . 下面通過一些例子來講解裝飾模式的用法和加深對裝飾模式的理解

*以手機爲例子,手機的主要功能是打電話,除了打電話,我們可以給手機添加彩鈴和打完電話後播放音樂等其他的裝飾活動。*

1)創建手機的接口

public interface Phone {
    public abstract void call();
    }

2)這裏實現手機的Phone,用的是IPhone,也可以是其他的手機

public class IPhone implements Phone {
    @Override
    public void call() {
        System.out.println("手機可以打電話了");
    }
    }

3)定義一個手機的裝飾類,它實現Phone接口,並且是一個抽象類

public abstract class PhoneDecorate implements Phone {

    private Phone p;

    public PhoneDecorate(Phone p) {
        this.p = p;
    }

    @Override
    public void call() {
        this.p.call();
    }
    }

注意:下面兩個類即是裝飾的具體類
4)定義手機可以聽彩鈴的類

public class RingPhoneDecorate extends PhoneDecorate {

    public RingPhoneDecorate(Phone p) {
        super(p);
    }

    @Override
    public void call() {
        System.out.println("手機可以聽彩鈴");
        super.call();
    }
        }

5)定義手機可以在打完電話後聽音樂的具體類

public class MusicPhoneDecorate extends PhoneDecorate {

    public MusicPhoneDecorate(Phone p) {
        super(p);
    }

    @Override
    public void call() {
        super.call();
        System.out.println("手機可以聽音樂");
    }
    }

6)對上面裝飾設計模式進行測試

public class PhoneDemo {
    public static void main(String[] args) {
        Phone p = new IPhone();
        p.call();
        System.out.println("------------");

        // 需求:我想在接電話前,聽彩鈴
        PhoneDecorate pd = new RingPhoneDecorate(p);
        pd.call();
        System.out.println("------------");

        // 需求:我想在接電話後,聽音樂
        pd = new MusicPhoneDecorate(p);
        pd.call();
        System.out.println("------------");

        /*==下面可以進行自由的組合=============*/

        // 需求:我要想手機在接前聽彩鈴,接後聽音樂
        // 自己提供裝飾類,在打電話前聽彩鈴,打電話後聽音樂
        pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));
        pd.call();
        System.out.println("----------");

        /*==下面是我們用到的IO流,他採用的就是這種設計模式==*/
        // 想想我們在IO流中的使用
        // InputStream is = System.in;
        // InputStreamReader isr = new InputStreamReader(is);
        // BufferedReader br = new BufferedReader(isr);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(
                System.out)));

        Scanner sc = new Scanner(System.in);
    }
    }

5.總結
裝飾設計模式是的功能的一個擴展,在一些需要靈活的組合功能的的設計中使用它是非常好的設計方法

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