java-设计模式(结构型)-【代理模式】
1.代理模式(ProxyMode)
? 定義:外觀模式是對類與類之間關系的描述,而代理模式是對原來的方法添加其他的操作。
? ? ? ? ? 代理有“網關”的含義,比如用戶訪問論壇,則要經過代理(網關)授權給你才能訪問,即
? ? ? ? ? 游客和注冊用戶的權限不同。
? ? ? ? ? 比如說你要去買房子,而買房子的過程包括:1.看房->2.談價->3.簽訂合約->4.正式入手(買房)->5.入住。
? ? ? ? ? 而代理類就是對步驟4操作添加其他操作,而這些操作都由代理類幫你完成。簡化了你的買房過程。
? 總結:對于某些“遠程”(難以完成的)操作,為了能快速完成,此時可以借助代理類幫我們完成部分操作。
? ? ? ? ? ?比如遠程訪問一張大圖時,由于網絡原因不知何時回返回過來,可以通過代理類先提前返回一個縮略圖
? 使用場景:
? ? (1)遠程代理。典型的就是客戶端與webservice使用的情況,客戶端由于是針對OOP編程,而不是針對webservice中的方法進行編程,
? ? ? ? ? ?所以得在客戶端模擬一下webservice的環境,用proxy來對webservice進行包裝,這樣就可以使用proxy代理類來遠程操作webservice了。
??? (2)虛擬代理。比如你要開發一個大文檔查看軟件,大文檔中有大的圖片,有可能一個圖片有100MB,在打開文件時不可能將所有的圖片都顯示出來,
? ? ? ? ? ?這樣就可以使用代理模式,當需要查看圖片時,用proxy來進行大圖片的打開。
??? (3)安全代理。其實也就是本例中所舉的買車的例子,金錢不夠不可以買車!
??? (4)智能指引。比如在訪問一個對象時檢測其是否被鎖定等情況。
? ? ? ? ? ? ? 對已有的方法的進行改進,此時有兩種辦法:
? ? ? ? ? ? ? ? 1、修改原有的方法來適應。這樣違反了“對擴展開放,對修改關閉”的原則。
? ? ? ? ? ? ? ? 2、就是采用一個代理類調用原有的方法,且對產生的結果進行控制。這種方法就是代理模式。
? ? ? ? ? ? ? ? ? ? ?使用代理模式,可以將功能劃分的更加清晰,有助于后期維護!
2.圖解
? 2.1 共同的接口方法
//買車接口 public interface BuyCar {//買車的行為void buyCar(); }2.2 實現接口的人類
//人類:具有現金,名字屬性,具有買車行為的接口。 public class People implements BuyCar {private int cash;private String username;//買車行為@Overridepublic void buyCar() {// TODO Auto-generated method stubSystem.out.println(this.username+"買了一輛小車");}public int getCash() {return cash;}public void setCash(int cash) {this.cash = cash;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;} }2.3 實現接口的代理類
//安全代理類 //人買車代理類:具有“人”成員,具有買房接口的方法 public class ProxyPeople implements BuyCar {private People p=null;private String proxyname=null;public ProxyPeople(String proxyname){this.proxyname=proxyname;}//對于人買車的行為進行安全代理@Overridepublic void buyCar() {if(p==null){System.out.println("沒人來買車,"+this.proxyname+"繼續等待客戶光臨");return ;}System.out.println(proxyname+"在陪"+p.getUsername()+"客戶買車。。。");//符合條件則可以買車。if(p.getCash()>10000){//代理之前的操作。。。System.out.println(this.proxyname+":"+p.getUsername()+"有"+p.getCash()+"元,你可以買10000以上的小車");p.buyCar();//代理之后的操作。。。System.out.println(this.proxyname+"成功代理"+p.getUsername()+"買了一輛車");}elseSystem.out.println(this.proxyname+":"+p.getUsername()+"有"+p.getCash()+"元,低于10000,無法買車");}public People getP() {return p;}public void setP(People p) {if(p!=null)System.out.println(p.getUsername()+"先生/女士,來買車了。。。");this.p = p;} }2.4 測試
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubPeople p=new People();p.setCash(12000);p.setUsername("黃生");ProxyPeople proxy=new ProxyPeople("A車代理");proxy.setP(p);proxy.buyCar();p.setCash(5000);proxy.buyCar();proxy.setP(null);proxy.buyCar();} }2.5 運行結果
黃生先生/女士,來買車了。。。 A車代理在陪黃生客戶買車。。。 A車代理:黃生有12000元,你可以買10000以上的小車 黃生買了一輛小車 A車代理成功代理黃生買了一輛車 A車代理在陪黃生客戶買車。。。 A車代理:黃生有5000元,低于10000,無法買車 沒人來買車,A車代理繼續等待客戶光臨
轉載于:https://www.cnblogs.com/beyondbycyx/p/4425164.html
總結
以上是生活随笔為你收集整理的java-设计模式(结构型)-【代理模式】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据项目及实现
- 下一篇: bootice添加黑苹果引导_懒人黑苹果