代理模式之靜態代理
阿新 • • 發佈:2020-12-16
代理模式分為靜態代理和動態代理,本篇文章談談我對於靜態代理的理解。
還是先上程式碼
//一個名為網路的介面
interface NetWork{
public void browser();
}
//被代理類,網路服務
class Server implements NetWork{
@Override
public void browser() {
System.out.println("被代理類");
}
}
//代理類
class ProxyServer implements NetWork{
private NetWork netWork;
//代理類的構造器
public ProxyServer(NetWork netWork){
this.netWork = netWork;
}
public void check(){
System.out.println("檢查網路");
}
@Override
public void browser() {
check();
netWork.browser();//代理類呼叫被代理類的方法
}
}
//主函式
public static void main(String[] args) {
//通過Server新生成了一個物件server,server是被代理類的物件
Server server = new Server();
/*通過ProxyServer新生成了一個物件proxyServer ,
然後將sever賦值給了proxyServer */
ProxyServer proxyServer = new ProxyServer(server);
//通過proxyServer 呼叫browser()方法
proxyServer.browser();
}
執行結果:
代理類和被代理類要實現介面,所以兩個類中都要覆蓋介面中的browser()方法。
我們來梳理一下程式碼的執行過程,
呼叫的browser方法是屬於代理類中的browser方法,但是由於代理類中的browser方法又呼叫了被代理類中的browser方法,所以被代理類的browser方法得以被呼叫。
而做到讓被代理方法可以呼叫代理方法中的browser方法的是介面NetWork,代理類的構造器是有參的,它的引數就是NetWork型別的變數,我們是通過NetWork型別的變數呼叫了被代理類的browser方法。
ProxyServer proxyServer = new ProxyServer(server);
/*這行程式碼就是多型性的體現,
宣告的是ProxyServer 型別,
但是引用卻是Server型別的*/
如果熟悉多型的知識,那麼這個方法的呼叫過程理解起來就容易多了。
代理模式就是為了擴充套件功能,同時還保有被代理類的功能。