Java代理模式相对来讲比较简单和容易理解。
一, 代理模式(Proxy)的定义教材里定义很简单:
所谓代理模式, 就是为其他对象提供一种代理控制对这个对象的访问.
上面出现了3个名词:
1.其他对象
2.一种代理
3.这个对象
实际上就是:
这个对象 找了 一种代理来 避免其他对象的访问
二, 代理模式的例子例如有个狐狸揍1个只狗, 给它1个闷棍, 再1个上勾拳.
但是狐狸不想自己去, 是怕被寻仇.
简单来讲, 就是狐狸想揍狗, 但是不想让狗知道狐狸要揍他.
所以狐狸找了熊来做代理... 就是让熊去揍狗..
熊对狐狸说: 我不会揍狗的技能啊,
狐狸对熊说: 你用我的技能就可以了.
揍狗接口 Hitable<T>:public interface Hitable<T> {
public void hit(T o);
}
狗类Dog:
public class Dog {
private String name;
public Dog(String name){
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
狐狸实现了揍狗接口:
public class Fox implements Hitable<Dog> {
@Override
public void hit(Dog g){
this.sap(g);
this.uppercut(g);
}
//闷棍
private void sap(Dog g){
System.out.println("give " + g.getName() + " a Sap!");
}
//上勾拳
private void uppercut(Dog g){
System.out.println("give " + g.getName() + " a Uppercute!");
}
}
就是给狗1个闷棍 + 上钩拳啦
熊类ProxyBear:为了揍狗, 熊也要实现揍狗接口..
但是熊实际上用的是狐狸的技能来揍狗.
package proxyPattern;
public class ProxyBear implements Hitable<Dog>{
private Hitable<Dog> f = null;
public ProxyBear(){
if (null == f){
f = new Fox();
}
}
@Override
public void hit(Dog g){
if (null != f){
System.out.println("Bear hit InterDogChicke!");
f.hit(g);
System.out.println("Bear bite InterDogChicke!");
}
}
}
客户端代码:
Dog g = new Dog("InterDogChicken");
ProxyBear b = new ProxyBear();
b.hit(g);
输出:
看上去就好像一只熊把狗揍了, 隐藏了狐狸了这个存在.
也就是狗不知道实际上狐狸在揍它..
实际上, 这个模式也加入了熊自己的技能... 相当与对狐狸技能的增强!
UML: 三,代理模式的一般用途1. 远程代理:
就是未1个对象在不同的地址空间提供局部代理. 隐藏这个对象存在与另1个地址空间的事实.