設計模式 11 —— 代理模式 設計模式 1 ——觀察者模式 設計模式 2 —— 裝飾者模式 設計模式 3 —— 迭代器和組合模式(迭代器) 設計模式 4 —— 迭代器和組合模式(組合) 設計模式 5

設計模式目錄:html

設計模式 1 ——觀察者模式java

設計模式 2 —— 裝飾者模式 設計模式

設計模式 3 —— 迭代器和組合模式(迭代器)安全

設計模式 4 —— 迭代器和組合模式(組合)ide

設計模式 5 —— 工廠模式post

設計模式 6 —— 單件模式學習

設計模式 7 —— 命令模式url

設計模式 8 —— 適配器和外觀模式spa

設計模式 9 —— 模板方法模式.net

設計模式 10 —— 狀態模式

設計模式 11 —— 代理模式

 

 

參考

 

代理模式爲另外一個對象提供一個替身或佔位符以控制這個對象的訪問。

使用代理模式建立表明,讓表明對象控制某些對象的訪問,被代理的對象能夠是遠程的對象、建立開銷大的對象或者須要安全控制的對象。

幾種代理控制訪問的方式:

  • 遠程代理控制訪問遠程對象(見上篇博客JAVA RMI 實例
  • 虛擬代理控制訪問建立開銷大的資源
  • 保護代理基於權限控制對資源的訪問

 

遠程代理

 

 

  • Subject, 爲RealSubject和Proxy提供了接口, 經過實現同一個接口, Proxy在RealSubject出現的地方取代它
  • RealSubject是真正作事的對象,它是被proxy代理和控制訪問的對象.
  • Proxy持有RealSubject的引用。在某些例子中, Proxy還會負責RealSubject對象的建立與銷燬.客戶和RealSubject的交互都必須經過Proxy.由於Proxy和RealSbuject實現相同的接口(Subject),因此任何用到RealSubject的地方,均可以用Proxy取代。Proxy也控制了對RealSubject的訪問,在某些狀況下,咱們可能須要這樣的控制。這些狀況包括RealSubject是遠程的對象, RealSubject建立開銷大, 或RealSubject須要被保護。

源代碼

  抽象對象角色

package cn.telling.rmi;

/**
 * 
 * @ClassName: AbstractObject
 * TODO
 * @author xingle
 * @date 2015-9-29 上午10:48:42
 */
public abstract class AbstractObject {
    //操做
    public abstract void operation();

}

 

目標對象角色

package cn.telling.rmi;

/**
 * 
 * @ClassName: RealObject TODO
 * @author xingle
 * @date 2015-9-29 上午10:52:49
 */
public class RealObject extends AbstractObject {

    /**
     * 
     * @Description: TODO
     * @author xingle
     * @data 2015-9-29 上午10:53:05
     */
    @Override
    public void operation() {
        // 一些操做
        System.out.println("一些操做");
    }

}

 

代理對象角色

package cn.telling.rmi;

/**
 * 
 * @ClassName: ProxyObject
 * TODO
 * @author xingle
 * @date 2015-9-29 上午10:54:31
 */
public class ProxyObject extends AbstractObject{
    RealObject realObject = new RealObject();

    /**
     * 
     * @Description: TODO
     * @author xingle
     * @data 2015-9-29 上午10:54:43
     */
    @Override
    public void operation() {
        System.out.println("調用目標對象 before 操做");
        realObject.operation();
        System.out.println("調用目標對象 after 操做");
    }

}

 

客戶端

package cn.telling.rmi;

/**
 * 
 * @ClassName: Client
 * TODO
 * @author xingle
 * @date 2015-9-29 上午10:57:54
 */
public class Client {
    
    public static void  main(String[] args){
        AbstractObject obj = new ProxyObject();
        obj.operation();
    }

}

 

執行結果:

 

 


 

參考:

  1. 【設計模式】學習筆記15:代理模式(Proxy Pattern)

  2. 【設計模式】學習筆記16:代理模式之虛擬代理(實現CD封面加載器)

  3. 《JAVA與模式》之代理模式

  4. 【設計模式】學習筆記17:代理模式之保護代理與Java反射
  5. java設計模式之——代理模式

相關文章
相關標籤/搜索