設計模式之禪學習筆記08--代理模式
阿新 • • 發佈:2018-12-07
1.代理模式
是一個使用率非常高的模式。代理模式也叫委託模式,他是為其他物件提供一種代理以控制對這個物件的訪問
類圖:代理主題角色和具體的主題角色具有相同的抽象主題介面
Subject抽象主題角色:
抽象主題類可以是抽象類也可以是介面,是一個最普通的業務型別定義,無特殊要求。
RealSubject具體主題角色:
也叫做被委託角色、被代理角色。它才是冤大頭,是業務邏輯的具體執行者。
Proxy代理主題角色:
也叫做委託類、代理類。它負責對真實角色的應用,把所有抽象主題類定義的方法限制。委託給真實主題角色實現,並且在真實主題角色處理完畢前後做預處理和善後處理工作。
2.舉個例子
建立一個抽象主題類,常用的是介面
package com.wx.proxypattern.base; /* Subject抽象主題角色: 抽象主題類可以是抽象類也可以是介面,是一個最普通的業務型別定義,無特殊要求 */ public interface Subject { public void request(); }
建立一個具體主題類,也叫委託類,實現抽象主題類。
package com.wx.proxypattern.imp;
import com.wx.proxypattern.base.Subject;
/*
也叫做被委託角色、被代理角色。是業務邏輯的具體執行者。
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("需要被代理的角色");
}
}
建立一個代理主題角色SubjectProxy,實現抽象主題介面。並通過建構函式來傳遞代理者。
package com.wx.proxypattern.imp;
import com.wx.proxypattern.base.Subject;
/*
代理主題角色
*/
public class SubjectProxy implements Subject {
//要代理哪個實現類
private Subject subject=null;
//被預設代理者
public SubjectProxy()
{
this.subject=new RealSubject();
}
//通過建構函式傳遞代理者
public SubjectProxy(Subject subject)
{
this.subject=subject;
}
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
//預處理
public void before()
{
System.out.println("預處理");
}
//善後處理
public void after()
{
System.out.println("善後處理");
}
}
測試:
package com.wx.proxypattern.test;
import com.wx.proxypattern.base.Subject;
import com.wx.proxypattern.imp.SubjectProxy;
import com.wx.proxypattern.imp.RealSubject;
public class TestProxy {
public static void main(String[] args)
{
Subject subject=new RealSubject();
SubjectProxy proxy = new SubjectProxy(subject);
proxy.request();
}
}
代理模式的優點:
職責清晰
真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理
完成一件事務,附帶的結果就是程式設計簡潔清晰。
高擴充套件性
具體主題角色是隨時都會發生變化的,只要它實現了介面,甭管它如何變化,都逃不脫如來佛的手掌(介面),那我們的代理類完全就可以在不做任何修改的情況下使用。