代理模式

Posted by 石玉军 on 2018-07-26

代理模式;给某个对象提供一个代理对象,由代理对象持有对原对象的引用。

代理模式就比较符合中国人含蓄的性格,假如有个姑娘想要找个对象,但是直接满大街去喊我要找对象的不是很多吧。大部分的女孩还是倾向于先去找一个媒人,让媒人来给自己介绍对象。这里的媒人其实就是女孩的代理对象了。

先来看一下类图:

图片

我们可以看到女孩跟媒人都实现了一个相亲的接口,然后呢媒人持有女孩的引用来调用女孩展示自己的方法,代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface BlindDate {
public void show();
}

public class Girl implements BlindDate {

@Override
public void show() {
System.out.println("女孩展示自己");
}
}

public class MatchMaker implements BlindDate {
BlindDate bd;

MatchMaker(BlindDate bd){
this.bd=bd;
}

@Override
public void show() {
System.out.println("媒人牵线搭桥");
bd.show();
System.out.println("媒人收取中介费");
}
}

上方这种写法确实实现了代理模式,但是细心的你可能会发现,这不符合逻辑呀,媒人怎么能也有show方法呢,她是代理,没必要搞得跟女孩一样吧,所以呢又出现了下方的实现方式

图片

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class DynamicMatchMaker {
private Object girl;

DynamicMatchMaker(Object girl) {
this.girl = girl;
}

public Object getProxy() {
return Proxy.newProxyInstance(
girl.getClass().getClassLoader(),
girl.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("媒人牵线搭桥");
Object returnValue = method.invoke(girl, args);
System.out.println("媒人收取中介费");
return returnValue;
}
});
}
}

这种实现看来其实还是可以的哈,满符合逻辑的,相当于找媒人获得了女孩的联系方式