目的:在代理類中實現(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