1 代理的作用
代理模式是常用的Java設(shè)計模式,它的特征是代理類與委托類有同樣的接口冕广,代理類主要負責(zé)為委托類預(yù)處理消息疏日、過濾消息、把消息轉(zhuǎn)發(fā)給委托類撒汉,以及事后處理消息等沟优。代理類與委托類之間通常會存在關(guān)聯(lián)關(guān)系,一個代理類的對象與一個委托類的對象關(guān)聯(lián)睬辐,代理類的對象本身并不真正實現(xiàn)服務(wù)挠阁,而是通過調(diào)用委托類的對象的相關(guān)方法,來提供特定的服務(wù)溯饵。
2 代理模式的例子
假設(shè)有一個Italk接口侵俗,有空的方法talk(說話),所有的Person對象都實現(xiàn)(implements)這個接口丰刊,實現(xiàn)talk方法隘谣,程序有很多地方都將Person實例化,執(zhí)行talk方法啄巧,后來發(fā)現(xiàn)程序里有一些除了要說話以外還要唱歌(sing)寻歧,那么我們既不能在Italk接口里增加sing()方法,又不能在每個Person對象都增加sing方法秩仆,我們只有增加一個代理類TalkProxy码泛,這個代理類里實現(xiàn)talk和sing方法,然后在需要sing方法的地方調(diào)用代理類即可澄耍,代碼如下:
2.1 接口類Italk
public interface Italk
{
public void talk(String msg);
}
2.2 委托類Person
public class Person implements Italk
{
public String name;
public String age;
public Person(String name, String age)
{
this.name = name;
this.age = age;
}
public void talk(String msg)
{
System.out.println(msg + "! 大家好, 我是 " + name + ", 我年齡是 " + age);
}
}
2.3 代理類TalkProxy
public class TalkProxy implements Italk
{
private Italk talker;
public TalkProxy(Italk talker)
{
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);
}
}
2.4 測試類:
public class Test
{
public static void main(String[] args)
{
Italk person = new Person("張三", "20");
person.talk("hi");
System.err.println(">>>>>>>>>>>>>>>");
TalkProxy talker = new TalkProxy(person);
talker.talk("hi", "<<歌唱祖國>>");
}
}
2.5 代碼分析
代理分為靜態(tài)代理和動態(tài)代理噪珊,上面的例子是靜態(tài)代理晌缘,后面的文章我會再寫一下關(guān)于動態(tài)代理,以及使用ASM生成代理類的例子痢站。
學(xué)習(xí)Java的同學(xué)注意了A谆!瑟押!
學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話,歡迎加入Java學(xué)習(xí)交流群346942462星掰,我們一起學(xué)Java多望!