1. 程式人生 > >設計模式--代理模式

設計模式--代理模式

ring caller IT 客戶端 目標 ble 調用 [] 出版社

Proxy Pattern,23種常用的面向對象軟件的設計模式之一。(設計模式的說法源自《設計模式》一書,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。該書提出了23種基本設計模式,第一次將設計模式提升到理論高度,並將之規範化。)

1 代理模式定義

為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。

2 優點

  • (1).職責清晰
    真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。

  • (2).代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。

  • (3).高擴展性

3 代理模式實現

代理模式主要是多態的體現,代理對象與被代理對象都實現與同一個接口(保證雙方能做一樣的事情),再由代理對象幹被代理對象的活

  • 1)定義一個公用的上級接口CommonPerson,定義shopping()、bringFood()等方法

  • 2)定義代理對象ProxyPersonA類與被代理對象ProxiedPersonB類,都實現CommonPerson接口,實現所有方法

  • 3)定義調用方Caller類,訪問代理對象,卻調用的是被代理對象的方法,實現代理模式

4 動態代理與靜態代理

代理模式分為靜態代理、動態代理。

  • 1)靜態代理是由程序員創建或工具生成代理類的源碼,再編譯代理類。所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委托類的關系在運行前就確定了。

  • 2)動態代理是在實現階段不用關心代理類,而在運行階段才指定哪一個對象。

5 代碼實現

5.1 統一上級接口

/**
 * @Description: 統一上級接口(讓代理對象與被代理對象擁有同樣的方法才能做同樣的事情)
 * @Author: qiuxx
 * @Date: 19:48 2018/6/18
 */
public interface CommonPerson {

    /**
     * 購物
     */
    public void shopping();

    /**
     * 帶飯
     */
    public void bringFood();
}

5.2 代理(與被代理)對象

/**
 * @Description: 代理對象A
 * @Author: qiuxx
 * @Date: 19:50 2018/6/18
 */
public class ProxyPersonA implements CommonPerson {

    private CommonPerson commonPerson;

    private ProxyPersonA(){

    }

    public ProxyPersonA(CommonPerson commonPerson){
        this.commonPerson = commonPerson;
    }

    @Override
    public void shopping() {
        this.commonPerson.shopping();
    }

    @Override
    public void bringFood() {
        this.commonPerson.bringFood();
    }
}

/**
 * @Description: 被代理對象B
 * @Author: qiuxx
 * @Date: 19:50 2018/6/18
 */
public class ProxiedPersonB implements CommonPerson {

    @Override
    public void shopping() {
        System.out.println("我是被代理的對象B,現在出去購物去");
    }

    @Override
    public void bringFood() {
        System.out.println("我是被代理的對象B,現在幫別人帶飯去");
    }
}

5.3 調用方Caller

/**
 * @Description: 調用方(訪問代理對象方法,做被代理對象的事情)
 * @Author: qiuxx
 * @Date: 19:55 2018/6/18
 */
public class Caller {

    public static void main(String[] args){
        ProxiedPersonB proxiedPersonB = new ProxiedPersonB();//被代理對象B
        //創建代理對象A
        ProxyPersonA proxyPersonA = new ProxyPersonA(proxiedPersonB);
        //看似在訪問代理對象A的方法,實際是調用了被代理對象B的方法
        proxyPersonA.shopping();
        proxyPersonA.bringFood();
    }
}

博客地址:https://qiuxx404.github.io/2018/06/18/原創/設計模式/設計模式-代理模式

設計模式--代理模式