代理模式-go/java實現(xiàn)

目的:在代理類中實現(xiàn)對操作目標(biāo)類的控制,間接訪問
優(yōu)點:中介隔離了一層,調(diào)用對象類的時候,不需要直接操作,而是由第三方的代理類操作,這樣更有利于解耦,有高擴(kuò)展性
缺點:代碼量增加,靜態(tài)代理的每一個實體類的業(yè)務(wù)邏輯都需要有個對應(yīng)代理類來完成。
設(shè)計場景如下:
我們現(xiàn)在要通過中介買房,我們需要做的是看房,中介會完成幫我們跟業(yè)主溝通,挑選房子,帶我們?nèi)タ矗描€匙開門,談價格等等一系列工作,而我們需要做的就是看房子和付款。

靜態(tài)代理——golang實現(xiàn):

package proxypattern_static

import "fmt"

/*接口*/
type ISeller interface {
    /*定義接口實現(xiàn)方法*/
    deal(int)
}
/*代理類*/
type ProxySeller struct {
    seller Seller
}
/*實體類*/
type Seller struct {

}

/*代理類構(gòu)造方法*/
func newProxySeller(seller Seller) *ProxySeller {
    return &ProxySeller{
        seller:seller,
    }
}
/*代理類實現(xiàn)接口及業(yè)務(wù)邏輯
    中介代替買家完成工作
*/
func (proxySeller ProxySeller) deal(money int) {
    if proxySeller.seller.deal(money) {
        proxySeller.seller.connectMoney(money)
        proxySeller.seller.transfer()
        fmt.Println("交易成功")
    } else {
        fmt.Println("交易失敗")
    }
    fmt.Println("交易結(jié)束")
}

/*實體類實現(xiàn)接口
    賣家交易函數(shù)
 */
func (Seller) deal(money int) bool{
    if money > 100 {
        return true
    } else {
        return false
    }
}
/*實體類
    賣家收錢函數(shù)
*/
func (Seller) connectMoney(money int) {
    fmt.Println("賣家收到錢")
}

/*實體類
    賣家過戶函數(shù)
*/
func (Seller) transfer(){
    fmt.Println("賣家過戶")
}

func Excute(){
    proxySeller := newProxySeller(*new(Seller))
    proxySeller.deal(50)
    proxySeller.deal(200)
}

動態(tài)代理——java實現(xiàn)(后面學(xué)會go怎么實現(xiàn)再補(bǔ)充)
代理類實現(xiàn)InvocationHandler接口

public class ProxyHandler implements InvocationHandler {

    private Object object;

    public Object newProxyHandler(Object object) {
        this.object = object;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        ISeller seller = (ISeller) this.object;
        if((boolean) method.invoke(this.object, args)) {
            System.out.println("交易成功");
            return true;
        } else {
            System.out.println("交易失敗");
            return false;
        }
    }
}

接口

public interface Seller {
    public boolean deal(int price);
}

實現(xiàn)接口的實體類

public class ISeller implements Seller {

    @Override
    public boolean deal(int price) {
        // TODO Auto-generated method stub
        return price > 100 ? true : false;
    }
}

測試類

public class Main {

    public static void main(String args[]) {
        ProxyHandler proxyHandler = new ProxyHandler();
        Seller seller = (Seller) proxyHandler.newProxyHandler(new ISeller());
        seller.deal(200);
        seller.deal(50);
    }
}

動態(tài)代理多用來實現(xiàn)面向切面編程,也就是所謂的AOP

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容