原理
代理模式的主要作用是為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
代理模式的思想是為了提供額外的處理或者不同的操作而在實際對象與調用者之間插入一個代理對象。這些額外的操作通常需要與實際對象進行通信。
套用場景
例如:假設有一組對象都實現同一個接口,實現同樣的方法,但這組對象中有一部分對象需要有單獨的方法,傳統的笨辦法是在每一個套用端都加上這個單獨的方法,但是代碼重用性低,耦合性高。
如果用代理的方法則很好的解決了這個問題。
代碼示例
假設有一個Italk接口,有空的方法talk()(說話),所有的people對象都實現(implements)這個接口,實現talk()方法,前端有很多地方都將people實例化,執行talk方法,後來發現這些前端里有一些除了要說話以外還要唱歌(sing),那么我們既不能在Italk接口裡增加sing()方法,又不能在每個前端都增加sing方法,我們只有增加一個代理類talkProxy,這個代理類里實現talk和sing方法,然後在需要sing方法的客戶端調用代理類即可,代碼如下:
接口類
public interface Italk {
public void talk(String msg);
}
實現類
public class People implements Italk {
public String username;
public String age;
public String getName() {
return username;
}
public void setName(String name) {
this.username= name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public People(String name1, String age1) {
this.username= name1;
this.age = age1;
}
public void talk(String msg) {
System.out.println(msg+"!你好,我是"+username+",我年齡是"+age);
}
}
代理類
public class TalkProxy implements Italk {
Italk talker;
public TalkProxy (Italk talker) {
//super();
this.talker=talker;
}
public void talk(String msg) {
talker.talk(msg);
}
public void talk(String msg,String singname) {
talker.talk(msg);
sing(singname);
}
private void sing(String singname){
System.out.println("唱歌:"+singname);
}
}
套用端
public class MyProxyTest {
/**代理模式
* @param args
*/
public static void main(String[] args) {
//不需要執行額外方法的
Italk people1=new People("湖海散人","18");
people1.talk("No ProXY Test");
System.out.println("-----------------------------");
//需要執行額外方法的
TalkProxy talker=new TalkProxy(people1);
talker.talk("ProXY Test","七里香");
}
}