1. 什麼是代理模式
提供了對目標對象另外的訪問方式;即通過代理對象訪問目標對象,這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標對象的功能。
代理模式的作用是:爲其他對象提供一種代理以控制對這個對象的訪問。
這裏使用到編程中的一個思想:不要隨意去修改別人已經寫好的代碼或者方法,如果需改修改,可以通過代理的方式來擴展該方法
我們可以通過下面兩個圖來大概瞭解下代理模式:
目標對象:肉塊,Client客戶端直接吃肉塊。
代理模式:漢堡,在肉塊外面包了蔬菜、麪餅,Client客戶端直接吃漢堡,間接吃了肉塊。當然,吃漢堡肯定比吃肉塊更可口!
2. 代理模式
下面我們來了解下代理模式的類圖:
代理模式分爲以下角色:
抽象角色(Subject)(規定爲食物):聲明真實對象和代理對象的共同接口。
代理角色(Proxy)(漢堡包):代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能夠代替真實對象。
同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
真實角色(RealSubject)(肉塊):代理角色所代表的真實對象,是我們最終要引用的對象。
3. 代理模式代碼實現
代碼結構如下:
Clinet:客戶端調用
ISubject:抽象角色
RealSubject:繼承ISubject,真實角色
ProxySubject:繼承ISubject,代理角色
Clinet.java
public class Client {
public static void main(String[] args)
{
new ProxySubject(new RealSubject()).request();
}
}
ISubject.java
public interface ISubject {
public void request();
}
ProxySubject.java
public class ProxySubject implements ISubject{
//代理角色對象內部含有對真實對象的引用
private ISubject realSubject;
public ProxySubject(ISubject realSubject){
this.realSubject = realSubject;
}
@Override
public void request()
{
//真實角色所完成的事情
realSubject.request();
//在真實角色操作之後所附加的操作
log(realSubject.getClass().getName());
}
private void log(String className)
{
System.out.println("代理AOP切入--打印log--"+className);
}
}
RealSubject.java
public class RealSubject implements ISubject {
@Override
public void request() {
System.out.println("From Real Subject1!");
}
}
運行結果: