大话设计模式—代理模式
在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。我們創建具有現有對象的對象,以便向外界提供功能接口。
大話設計模式中程杰老師的給出的解釋是代理模式:為其他對象提供一種代理以控制對這個對象的訪問。
主要解決:在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由于某些原因(比如對象創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。
代理模式結構圖如下:
以一個image的例子來看一下具體實現:
RealImage.java
public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);} }ProxyImage.java
public class ProxyImage implements Image{private RealImage realImage;private String fileName;public ProxyImage(String fileName){this.fileName = fileName;}@Overridepublic void display() {if(realImage == null){realImage = new RealImage(fileName);}realImage.display();} }ProxyPatternDemo.java
public class ProxyPatternDemo {public static void main(String[] args) {Image image = new ProxyImage("test_10mb.jpg");//圖像將從磁盤加載image.display(); System.out.println("");//圖像將無法從磁盤加載image.display(); } }運行結果:
Loading test_10mb.jpg Displaying test_10mb.jpg Displaying test_10mb.jpg第一次調用image.display()方法時,realImage不存在,程序會會實例化一個RealImage對象,RealImage的構造方法中調用了loadFromDisk()方法;當我們第二次調用image.display()方法時,realImage已經存在了,此時就不會在實例化RealImage對象,而是直直接調用display()方法。
代理模式的應用:
1、遠程代理:也就是為了一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在于不同地址空間的事實(webservice的使用就是這個原理);
2、虛擬代理:根據需要創建開銷很大的對象,通過它來存放實例化需要很大代價的真實對象(如瀏覽器中用到的使用代理模式來優化下載,HTML加載文字和圖片時,未加載的圖片顯示的圖片框就是真實圖片的虛擬代理);
3、安全代理:用來控制真實對象訪問時的權限(一般用于對象有不同的訪問權限的時候)。
4、智能指引:當調用真實的對象時,代理處理另外一些事(如在訪問一個實際對象之前,檢查其是否已經被鎖定,以確保其他對象不能對他作出修改)。
注意事項:
1、和適配器模式的區別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。
2、和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制。
總結
以上是生活随笔為你收集整理的大话设计模式—代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深复制VS浅复制(MemberwiseC
- 下一篇: 浏览器兼容性问题汇总及解决方案