1. 程式人生 > >Java設計模式之靜態代理模式(裝飾著模式)

Java設計模式之靜態代理模式(裝飾著模式)

靜態代理模式與裝飾著模式本質上是有區別的,但是具體的區別以後再說,大體上還是有很多共同點的,裝飾著模式本質是不對原有物件或者方法改變而增強程式或者方法的功能,實現的是無侵入式程式設計。

實現要求:

1.被裝飾類與裝飾類實現同一個介面 目的式是實現無侵入式變成
2.裝飾類必須持有原有物件的引用,
3.裝飾者去將要增強的方法重寫
4.裝飾者將不需要增強的方法直接引用

下面是沒有被裝飾的情況:

介面:
package cn.itcast.test.jt;

/**
 * @Description: 房子的模型
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:12$
 */
public interface HouseM { void createHouseM(); void beanDoor(); }
實現類
package cn.itcast.test.jt;

/**
 * @Description: 造一個房子
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:12$
 */
public class CHM implements HouseM {
    @Override
    public void createHouseM() {
        System.out.println("這個房子有桌子"
); System.out.println("這個房子有床鋪"); } @Override public void beanDoor() { System.out.println("這個門很好,不需要被裝飾"); } }

下面是測試類:

package cn.itcast.test.jt;

/**
 * @Description:
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:18$
 */
public class Test {
    //得到實現類
    public static
HouseM getInterface(){ //建立一個被裝飾類 CHM chm = new CHM(); //建立一個裝飾類 //DecorateH decorateH = new DecorateH(chm); return chm; } public static void main(String[] args) { HouseM houseM = getInterface(); houseM.beanDoor(); System.out.println("------------------------"); houseM.createHouseM(); } }

輸出

這個門很好,不需要被裝飾
------------------------
這個房子有桌子
這個房子有床鋪

給位裝飾著模式,對房子進行裝飾,新建裝飾類

package cn.itcast.test.jt;

import com.mchange.v3.decode.Decoder;

/**
 * @Description: 裝飾房子
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:14$
 */
public class DecorateH implements HouseM { //裝飾著必須實現原有物件的介面
    //裝飾者必須持有原有物件的引用
    private HouseM chm;

    public DecorateH(HouseM chm){
        this.chm = chm;
    }

    @Override
    public void createHouseM() {
        System.out.println("房子需要裝飾");
        System.out.println("給房子塗點顏料");
        System.out.println("----------------------------");
        chm.createHouseM();
        System.out.println("---------是不是很好看---------");
    }

    @Override
    public void beanDoor() {
        chm.beanDoor();
    }
}

重寫測試類

package cn.itcast.test.jt;

/**
 * @Description:
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:18$
 */
public class Test {
    //得到實現類
    public static HouseM getInterface(){
        //建立一個被裝飾類
        CHM chm = new CHM();
        //建立一個裝飾類
        DecorateH decorateH = new DecorateH(chm);
        return chm;
    }

    public static void main(String[] args) {
        HouseM houseM = getInterface();
        houseM.beanDoor();
        System.out.println("------------------------");
        houseM.createHouseM();
    }
}
測試結果
這個門很好,不需要被裝飾
------------------------
房子需要裝飾
給房子塗點顏料
----------------------------
這個房子有桌子
這個房子有床鋪
---------是不是很好看---------

總結:
動態地給一個物件新增一些額外的職責。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴充套件物件的功能。實習的是一種面向介面的程式設計