Java設計模式之代理模式


代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式:
  人如其名,代理相信大家都可以經常看到什么什么代理,現實中代理太多了。感受最真實的是火車票的代理,經常可以在街上看到,你買票的是在代理商買的,但是付的錢依然會交給鐵大哥,這就是代理。現實中的你可能會接觸的例子就是叫同學去給你買票,實際上不是你去買,但是是票是你的。這也是代理。
代理模式組成:
  抽象角色:通過接口或抽象類聲明真實角色實現的業務方法。
  代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象方法,並可以附加自己的操作。
  真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,供代理角色調用。
代理的UML圖
  
代理的優點:
  (1).職責清晰 真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過后期的代理完成一件完成事務,附帶的結果就是編程簡潔清晰。叫你去買票,我管你有沒有摔跤撒的,不需要關注這種問題。
  (2).代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。別人在路上一看,以為是你同學要買票去哪里,實際上買的是你的,保護了你。
  (3).高擴展性 只要符合火車站規定的人,同學都可以去代人買票。
下面就用代碼來實現着一個過程。
 1 package com.roc.prory;
 2 
 3 /**
 4  * 定義一個種類的人 抽象角色
 5  * 
 6  * @author liaowp
 7  * 
 8  */
 9 public interface Person {
10 
11     /**
12      * 可以去火車站買票
13      */
14     public void buyTicket();
15 
16 }
package com.roc.prory;
/**
 * 小王 代理角色
 * @author liaowp
 *
 */
public class XiaoWang implements Person {
    
    private Person  person = null;//默認就是一個人
    
    public XiaoWang(){//小王比較聰明,知道帶別人買票賺錢。默認是只賺小明的錢
        this.person = new XiaoMing();
    }
    
    public XiaoWang(Person per){//賺小明的不夠,只要是人就賺。
        this.person = per;
    }
    
    /**
     * 小王也是人,也可以去買票。
     */
    public void buyTicket() {//調不然方法去買票,代理商
        this.person.buyTicket();
    }

}
package com.roc.prory;

/**
 * 小明 真實角色
 * @author liaowp
 *
 */
public class XiaoMing implements Person {

    //比較懶
    
    /* 
     * 小明也是人,也可以去買票。
     * @see com.roc.prory.Person#buyTicket()
     */
    @Override
    public void buyTicket() {
        System.out.println("買小明的票");
    }

}
package com.roc.prory;
/**
 * 小麗
 * @author liaowp
 *
 */
public class XiaoLi implements Person {

    /**
     * 小麗也可以自己買票。
     */
    public void buyTicket() {
        System.out.println("買小麗的票");
    }

}
package com.roc.prory;
/**
 * 測試代理模式
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        XiaoWang xiaoWang = new XiaoWang();//new 的小王
        xiaoWang.buyTicket();//小王去買了小明的票,這就是代理
        
        XiaoLi xiaoLi = new XiaoLi();//買票也要有這個人呀。先把小麗 new 出來。
        XiaoWang mrWang = new XiaoWang(xiaoLi);//小麗說:小王幫我去買個票唄
        mrWang.buyTicket();//屁顛屁顛的跑去買了
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM