Java SE————靜態代理

    代理模式(proxy):

            給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用。

            在代理模式中,代理對象和目標對象需要實現同一個接口

IPerson.interface

package proxy;

public interface IPerson {
    public void say();
}

以日誌記錄爲例

若沒有代理,每個目標對象方法裏都要寫記錄日誌的代碼,是代碼冗餘。如下

public class Man implements IPerson {

    @Override
    public void say() {
        
        long begin = System.currentTimeMillis();
        System.out.println("男人賺錢養家");
        long end = System.currentTimeMillis();
        System.out.println(end-begin);
    }

}

若採用靜態代理:


    靜態代理:


      靜態代理髮生在編譯期間。收到創建的。在編譯時就已經將接口,被代理類,代理類等確定下來。代理類和代理對象都要實現同一個接口,同時,代理對象要操控目標對象。

缺點:接口和代理類是一對一的,有多個接口代理,就需要多個代理類,繁瑣,類爆炸。

Man.class

package proxy;

public class Man implements IPerson {

    @Override
    public void say() {
        System.out.println("男人賺錢養家");
    }

}

PersonProxy.class

package proxy;

public class PersonProxy implements IPerson{
    IPerson person;

    public PersonProxy(IPerson person){ //把目標對象person傳入
        this.person=person;             //生成本類的person對象
    }

    @Override
    public void say() {
        long begin = System.currentTimeMillis();
        person.say();                   //引用目標對象調用目標對象的方法
        long end = System.currentTimeMillis();
        System.out.println(end-begin);
    }
}

ProxTest.class

package proxy;

public class ProxTest {
    public static void main(String[] args) {
        Man man = new Man();
        Women women = new Women();
        OldMan oldMan = new OldMan();

        PersonProxy manProxy = new PersonProxy(man);        //生成多個代理類對象,爲不同的目標對象服務
        PersonProxy womanProxy = new PersonProxy(women);
        PersonProxy oldManProxy = new PersonProxy(oldMan);
        manProxy.say();
        womanProxy.say();
        oldManProxy.say();

      /*  運行結果:   男人賺錢養家
                    0
                    買衣購物
                    0
                    幹農活
                    0*/
    }
}


   

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