跟屌絲大哥學習設計模式---代理模式
代理模式是我們比較常用的設計模式之一。其中新思想是為了提供額外的處理或者不同的操作而在實際對象與調用者之間插入一個代理對象。這些額外的操作通常需要與實際對象進行通信,代理模式一般涉及到的角色有:
抽象角色:聲明真實對象和代理對象的共同接口;
代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當于對真實對象進行封裝。
真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
以下以發送消息為例來說明一個簡單的代理模式的基本實現:
首先明確目的:有一條消息,需要把這個消息發送出去,根據這個目的定義對應接口MessageHandler。需要的附加操作:假設需要驗證消息的長度不能超過指定長度并且不能為空,并且我們需要統計相關信息發送到次數,超過指定的次數我們需要輸出警報。我們通過代理模式來實現這個附加的操作。下面為對應的類關系圖及示例代碼。
public interface MessageHandler {
public void sendMessage(String msg);
}
//通過Email方式發送消息的實現類
public class EmailMessage implements MessageHandler {
@Override
public void sendMessage(String msg) {
// TODO Auto-generated method stub
System.out.println(msg+" send!!");
}
}
//消息處理的代理類
public class MessageProxy implements MessageHandler {
private static int count;
private MessageHandler emailMsg;
@Override
public void sendMessage(String msg) {
// TODO Auto-generated method stub
if(checkMessage(msg))
{
if(emailMsg==null) emailMsg=new EmailMessage();
count++;
emailMsg.sendMessage(msg);
System.out.println("Message sent:"+count);
}
}
private boolean checkMessage(String msg) {
return msg != null && msg.length() > 10;
}
}
//調用類
public class MainClass {
private static void runProxy(MessageHandler handler)
{
handler.sendMessage("message for test");
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
runProxy(new EmailMessage());
System.out.println("++++++++++++++++Pjroxy++++++++++++++++++");
runProxy(new MessageProxy());
}
}
輸出
message for test send!!
++++++++++++++++Pjroxy++++++++++++++++++
message for test send!!
Message sent:1
在例子中我們可以方便的在消息發送過程中添加各種需要的附加處理方式,也能方便的替換消息的處理方式,如將通過Email發送消息替換為通過短信發送消息,而調用方不會有絲毫察覺!在任何你想要將一些額外操作分離到具體對象之外,特別是希望能夠很容易做出修改,或者想在具體對象的方法執行前插入一些額外操作的時候,代理就顯得十分有用!
接口類Italk
public interface Italk {public void talk(String msg);
}
實現類people
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);
}
}
代理類talkProxy
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);
}
}
}
應用端myProxyTest
public class MyProxyTest {/**代理模式 * @param args */
public static void main(String[] args)
{
//不需要執行額外方法的
Italk people1=new People(" people1.talk("No ProXY Test");
System.out.println("-----------------------------");
//需要執行額外方法的
TalkProxy talker=new TalkProxy(people1);
talker.talk("ProXY Test","七里香");
}
}
代理結構如下圖所示
以通過代售點買火車票為例,代碼實現如下:
//提供買票的公共接口
interface Passenger {
public void buyTicket();
}
//乘客實體
public class RealPassenger implements Passenger {
@Override
public void buyTicket() {
// TODO Auto-generated method stub
System.out.print("購買了火車票");
}
}
//代售點
public class Proxy implements Passenger {
Passenger passenger;
public Proxy(Passenger p) {
this.passenger = p;
}
@Override
public void buyTicket() {
// TODO Auto-generated method stub
System.out.println("通過代售點");
passenger.buyTicket();
}
}
//測試類
public class Client {
public static void main(String[] args) {
Passenger passenger = new RealPassenger();
Passenger proxy = new Proxy(passenger);
proxy.buyTicket();
}
}
輸出結果:
通過代售點
購買了火車票
以 上的也可叫做靜態代理,是為了區別代理模式在Java中的另一種實現——動態代理。
接下來會為大家帶來動態代理
posted on 2012-12-13 11:20 順其自然EVO 閱讀(425) 評論(0) 編輯 收藏 所屬分類: 設計模式學習