1. 程式人生 > >代理模式__之深度剖析

代理模式__之深度剖析

在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種型別的設計模式屬於結構型模式。
官網文件__
http://www.runoob.com/design-pattern/proxy-pattern.html
意圖:為其他物件提供一種代理以控制對這個物件的訪問。

需求__現在有一個方法、要求計算方法實際執行的時間、但是有一個前提條件、不能對這個方法所在的類做任何改動___怎麼辦,???
使用代理__可以輕易的在方法的前邊後邊做任何事。

程式碼實現

1--------------
public interface Moveable {
    void move();
}


2----------------------------
public class Tank1 implements Moveable {
    @Override
    public void move() {
        System.out.print("zheng zai yi dong....");
    }
}



3--------------------------------------------
public class Dail2 implements Moveable {
//    Tank1 t;
    Moveable t;
    public Dail2(Moveable tank1) {
        super();
        t = tank1;
    }

    @Override
    public void move() {
        long start = System.currentTimeMillis();
        t.move();
        long end = System.currentTimeMillis();
        System.out.println("執行時間為:" + (end - start));
    }
}
4------------test
public static void main(String[] args) {
//        Tank1 t=new Tank1();
//        t.move();
        //記錄時間__
        Tank1 t = new Tank1();
        Dail2 d = new Dail2(t);
        Moveable m = d;
        m.move();
    }

主要解決:在直接訪問物件時帶來的問題,比如說:要訪問的物件在遠端的機器上。在面向物件系統中,有些物件由於某些原因(比如物件建立開銷很大,或者某些操作需要安全控制,或者需要程序外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此物件時加上一個對此物件的訪問層。

 * 何時使用:想在訪問一個類時做一些控制。
 * 如何解決:增加中間層  __Moveable t;
 * 關鍵程式碼:實現與被代理類組合。 __Moveable t;
【介面1__實現 兩層   代理類__同樣的介面 介面1 _Moveable t;提前聚合 __.class載入時move方法已經載入、可在方法前後做一些操作】

關鍵點:___在執行 new Dail2(t).move() 方法時 中t.move() 會呼叫 new Tank().move() 根本原因是在jvm載入類時已經聚合了物件tank

在這裡插入圖片描述