java設計模式(四)代理模式

來源:互聯網
上載者:User

標籤:ace   and   jin   style   art   extends   blog   目標   繼承   

  通過代理對象訪問目標對象,這樣可以增加對目標對象的額外操作,達到擴充目標對象功能的目的,如spring事務、AOP等。

  要點:1)抽象角色:通過介面或抽象類別聲明真實角色實現的業務方法。(例子中的Move)

     2)代理角色:實現抽象角色,是真實角色的代理(例子中的*Proxy)

     3)真實角色:實現抽象角色,定義真實角色所要實現的商務邏輯,供代理角色調用。(例子中的MoveImpl)

一、靜態代理

1、繼承實現靜態代理

移動介面

public interface Move {    public void move();}

移動實作類別

public class MoveProxy implements Move {    public void move() {        System.out.println("汽車正在運行......");    }}

車代理類

public class CarProxy extends MoveImpl {    @Override    public void move() {        long start_time = new Date().getTime();        System.out.println("汽車開始運行......");        super.move();        long end_time = new Date().getTime();        System.out.println("汽車結束運行,已耗用時間:" + (end_time - start_time));    }}

測試

public class Model {    public static void main(String[] args) {        CarProxy carProxy = new CarProxy();        carProxy.move();    }}

2、彙總實現靜態代理

  推薦使用彙總實現動態代理,這樣可以方便實現多個代理順序交換,方便擴充,如下

移動介面

public interface Move {    public void move();}

移動實作類別

public class MoveProxy implements Move {    public void move() {        System.out.println("汽車正在運行......");    }}

車代理類

public class CarProxy extends MoveImpl {    @Override    public void move() {        long start_time = new Date().getTime();        System.out.println("汽車開始運行......");        super.move();        long end_time = new Date().getTime();        System.out.println("汽車結束運行,已耗用時間:" + (end_time - start_time));    }}

日誌代理

public class LogProxy implements Move {    private Move obj;    public LogProxy(Move obj) {        this.obj = obj;    }    public void move() {        System.out.println("日誌開始......");        obj.move();        System.out.println("日誌結束......");    }}

測試

public class Model {    public static void main(String[] args) {        //推薦使用彙總實現動態代理,這樣可以方便實現多個代理順序交換,方便擴充,如下        MoveImpl moveProxy = new MoveImpl();        CarPropxy carPropxy = new CarPropxy(moveProxy);        LogProxy logProxy = new LogProxy(carPropxy);        logProxy.move();        System.out.println();        MoveImpl moveProxy1 = new MoveImpl();        CarPropxy carPropxy1 = new CarPropxy(moveProxy1);        LogProxy logProxy1 = new LogProxy(carPropxy1);        logProxy1.move();    }}

二、動態代理

移動介面

public interface Move {    public void move();}

移動實作類別

public class MoveProxy implements Move {    public void move() {        System.out.println("汽車正在運行......");    }}

 日誌代理

public class LogHandler implements InvocationHandler {    private Object obj;    public LogHandler(Object obj) {        this.obj = obj;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("日誌開始......");        method.invoke(obj);        System.out.println("日誌結束.......");        return null;    }}

時間代理

public class TimeHandler implements InvocationHandler {    private Object obj;    public TimeHandler(Object obj) {        this.obj = obj;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        long start_time = new Date().getTime();        System.out.println("汽車開始運行......");        method.invoke(obj);        long end_time = new Date().getTime();        System.out.println("汽車結束運行,已耗用時間:" + (end_time - start_time));        return null;    }}

測試

public class Model {    public static void main(String[] args) {        MoveImpl move = new MoveImpl();        Class c = move.getClass();        TimeHandler t = new TimeHandler(move);        Move m = (Move) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), t);        LogHandler l = new LogHandler(m);        Move m1 = (Move) Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), l);        m1.move();    }}

二者區別:JAVA學習篇--靜態代理VS動態代理

 

java設計模式(四)代理模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.