Java代理模式相對來講比較簡單和容易理解。
教材裡定義很簡單:
所謂代理模式, 就是為其他對象提供一種代理控制對這個對象的訪問.
上面出現了3個名詞:
1.其他對象
2.一種代理
3.這個對象
實際上就是:
這個對象 找了 一種代理來 避免其他對象的訪問
例如有個狐狸揍1個只狗, 給它1個悶棍, 再1個上勾拳.
但是狐狸不想自己去, 是怕被尋仇.
簡單來講, 就是狐狸想揍狗, 但是不想讓狗知道狐狸要揍他.
所以狐狸找了熊來做代理... 就是讓熊去揍狗..
熊對狐狸說: 我不會揍狗的技能啊,
狐狸對熊說: 你用我的技能就可以了.
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個悶棍 + 上鉤拳啦
為了揍狗, 熊也要實現揍狗接口..
但是熊實際上用的是狐狸的技能來揍狗.
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);
輸出:
看上去就好像一只熊把狗揍了, 隱藏了狐狸了這個存在.
也就是狗不知道實際上狐狸在揍它..
實際上, 這個模式也加入了熊自己的技能... 相當與對狐狸技能的增強!
1. 遠程代理:
就是未1個對象在不同的地址空間提供局部代理. 隱藏這個對象存在與另1個地址空間的事實.
2.虛擬代理:
根據需要創建開銷很大的對象, 通過虛擬代理來存放實例化需要很長時間的真實對象.
3.安全代理
用來控制對真實對象訪問的權限.(也就是本文例子, 狗只能找熊談談, 不會直接找狐狸)