Java的三種代理模式簡述
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了遂寧免費(fèi)建站歡迎大家使用!
本文著重講述三種代理模式在java代碼中如何寫出,為保證文章的針對(duì)性,暫且不討論底層實(shí)現(xiàn)原理,具體的原理將在下一篇文章中講述。
代理模式是什么
代理模式是一種設(shè)計(jì)模式,簡單說即是在不改變?cè)创a的情況下,實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的功能擴(kuò)展。
比如有個(gè)歌手對(duì)象叫Singer,這個(gè)對(duì)象有一個(gè)唱歌方法叫sing()。
假如你希望,通過你的某種方式生產(chǎn)出來的歌手對(duì)象,在唱歌前后還要想觀眾問好和答謝,也即對(duì)目標(biāo)對(duì)象Singer的sing方法進(jìn)行功能擴(kuò)展。
但是往往你又不能直接對(duì)源代碼進(jìn)行修改,可能是你希望原來的對(duì)象還保持原來的樣子,又或許你提供的只是一個(gè)可插拔的插件,甚至你有可能都不知道你要對(duì)哪個(gè)目標(biāo)對(duì)象進(jìn)行擴(kuò)展。這時(shí)就需要用到j(luò)ava的代理模式了。網(wǎng)上好多用生活中的經(jīng)理人的例子來解釋“代理”,看似通俗易懂,但我覺得不適合程序員去理解。程序員應(yīng)該從代碼的本質(zhì)入手。
public interface Italk {
public void talk(String msg);
} public class People implements Italk {
public String username;
public String age;
public String getName() {
return username;
}
public void setName(String name) {
this.username= name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public People(String name1, String age1) {
this.username= name1;
this.age = age1;
}
public void talk(String msg) {
System.out.println(msg+!你好,我是+username+,我年齡是+age);
}
} public class TalkProxy implements Italk {
Italk talker;
public TalkProxy (Italk talker) {
//super();
this.talker=talker;
}
public void talk(String msg) {
talker.talk(msg);
}
public void talk(String msg,String singname) {
talker.talk(msg);
sing(singname);
}
private void sing(String singname){
System.out.println(唱歌:+singname);
}
}
} public class MyProxyTest {
/**代理模式
* @param args
*/
public static void main(String[] args) {
//不需要執(zhí)行額外方法的
Italk people1=new People(湖海散人,18);
people1.talk(No ProXY Test);
System.out.println(-----------------------------);
//需要執(zhí)行額外方法的
TalkProxy talker=new TalkProxy(people1);
talker.talk(ProXY Test,七里香);
}
}
三大框架:Struts+Hibernate+Spring。Java三大框架主要用來做WEN應(yīng)用。
Struts主要負(fù)責(zé)表示層的顯示。
Spring利用它的IOC和AOP來處理控制業(yè)務(wù)(負(fù)責(zé)對(duì)數(shù)據(jù)庫的操作)。
Hibernate主要是數(shù)據(jù)持久化到數(shù)據(jù)庫。
再用jsp的servlet做網(wǎng)頁開發(fā)的時(shí)候有個(gè)web.xml的映射文件,里面有一個(gè)mapping的標(biāo)簽就是用來做文件映射的。當(dāng)在瀏覽器上輸入U(xiǎn)RL得知的時(shí)候,文件就會(huì)根據(jù)寫的名稱對(duì)應(yīng)到一個(gè)JAVA文件,根據(jù)java文件里編寫的內(nèi)容顯示在瀏覽器上,就是一個(gè)網(wǎng)頁。
擴(kuò)展資料:
Java框架益處:
減少設(shè)計(jì)辛勞:
集合框架通過提供有用的數(shù)據(jù)結(jié)構(gòu)和算法使你能集中注意力于你的程序的重要部分上,而不是為了讓程序能正常運(yùn)轉(zhuǎn)而將注意力于低層設(shè)計(jì)上。通過這些在無關(guān)API之間的簡易的互用性,使你免除了為改編對(duì)象或轉(zhuǎn)換代碼以便聯(lián)合這些API而去寫大量的代碼。
提高速度質(zhì)量:
集合框架通過提供對(duì)有用的數(shù)據(jù)結(jié)構(gòu)和算法的高性能和高質(zhì)量的實(shí)現(xiàn)使你的程序速度和質(zhì)量得到提高。因?yàn)槊總€(gè)接口的實(shí)現(xiàn)是可互換的,所以的程序可以很容易的通過改變一個(gè)實(shí)現(xiàn)而進(jìn)行調(diào)整。
另外,可以從寫自己的數(shù)據(jù)結(jié)構(gòu)的苦差事中解脫出來,從而有更多時(shí)間關(guān)注于程序其它部分的質(zhì)量和性能。
API缺點(diǎn):
許多API天生的有對(duì)集合的存儲(chǔ)和獲取。在過去,這樣的API都有一些子API幫助操縱它的集合內(nèi)容,因此在那些特殊的子API之間就會(huì)缺乏一致性,也不得不從零開始學(xué)習(xí),并且在使用時(shí)也很容易犯錯(cuò)。而標(biāo)準(zhǔn)集合框架接口的出現(xiàn)使這個(gè)問題迎刃而解。
參考資料來源:百度百科-Java框架
十大常用框架:
一、SpringMVC
二、Spring
三、Mybatis
四、Dubbo
五、Maven
六、RabbitMQ
七、Log4j
八、Ehcache
九、Redis
十、Shiro
延展閱讀:
一、SpringMVC
Spring Web MVC是一種基于Java的實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請(qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的。
模型(Model )封裝了應(yīng)用程序的數(shù)據(jù)和一般他們會(huì)組成的POJO。
視圖(View)是負(fù)責(zé)呈現(xiàn)模型數(shù)據(jù)和一般它生成的HTML輸出,客戶端的瀏覽器能夠解釋。
控制器(Controller )負(fù)責(zé)處理用戶的請(qǐng)求,并建立適當(dāng)?shù)哪P?,并把它傳遞給視圖渲染。
Spring的web模型 - 視圖 - 控制器(MVC)框架是圍繞著處理所有的HTTP請(qǐng)求和響應(yīng)的DispatcherServlet的設(shè)計(jì)。
Spring Web MVC處理請(qǐng)求的流程
具體執(zhí)行步驟如下:
1、 首先用戶發(fā)送請(qǐng)求————前端控制器,前端控制器根據(jù)請(qǐng)求信息(如URL)來決定選擇哪一個(gè)頁面控制器進(jìn)行處理并把請(qǐng)求委托給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;
2、 頁面控制器接收到請(qǐng)求后,進(jìn)行功能處理,首先需要收集和綁定請(qǐng)求參數(shù)到一個(gè)對(duì)象,這個(gè)對(duì)象在Spring Web MVC中叫命令對(duì)象,并進(jìn)行驗(yàn)證,然后將命令對(duì)象委托給業(yè)務(wù)對(duì)象進(jìn)行處理;處理完畢后返回一個(gè)ModelAndView(模型數(shù)據(jù)和邏輯視圖名);圖2-1中的3、4、5步驟;
3、 前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;圖2-1中的步驟6、7;
4、 前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶,圖2-1中的步驟8;至此整個(gè)結(jié)束。
二、Spring
2.1、IOC容器:
IOC容器就是具有依賴注入功能的容器,IOC容器負(fù)責(zé)實(shí)例化、定位、配置應(yīng)用程序中的對(duì)象及建立這些對(duì)象間的依賴。應(yīng)用程序無需直接在代碼中new相關(guān)的對(duì)象,應(yīng)用程序由IOC容器進(jìn)行組裝。在Spring中BeanFactory是IOC容器的實(shí)際代表者。
2.2、AOP:
簡單地說,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護(hù)性。AOP代表的是一個(gè)橫向的關(guān)系
AOP用來封裝橫切關(guān)注點(diǎn),具體可以在下面的場(chǎng)景中使用:
Authentication 權(quán)限?
Caching 緩存?
Context passing 內(nèi)容傳遞?
Error handling 錯(cuò)誤處理?
Lazy loading 懶加載?
Debugging調(diào)試?
logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準(zhǔn)?
Performance optimization 性能優(yōu)化?
Persistence持久化?
Resource pooling 資源池?
Synchronization 同步?
Transactions 事務(wù)
三、Mybatis
MyBatis 是支持普通 SQL查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫中的記錄。
總體流程:
(1)加載配置并初始化?
觸發(fā)條件:加載配置文件?
將SQL的配置信息加載成為一個(gè)個(gè)MappedStatement對(duì)象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲(chǔ)在內(nèi)存中。
(2)接收調(diào)用請(qǐng)求?
觸發(fā)條件:調(diào)用Mybatis提供的API?
傳入?yún)?shù):為SQL的ID和傳入?yún)?shù)對(duì)象?
處理過程:將請(qǐng)求傳遞給下層的請(qǐng)求處理層進(jìn)行處理。
(3)處理操作請(qǐng)求 觸發(fā)條件:API接口層傳遞請(qǐng)求過來?
傳入?yún)?shù):為SQL的ID和傳入?yún)?shù)對(duì)象
處理過程:
(A)根據(jù)SQL的ID查找對(duì)應(yīng)的MappedStatement對(duì)象。
(B)根據(jù)傳入?yún)?shù)對(duì)象解析MappedStatement對(duì)象,得到最終要執(zhí)行的SQL和執(zhí)行傳入?yún)?shù)。
(C)獲取數(shù)據(jù)庫連接,根據(jù)得到的最終SQL語句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫執(zhí)行,并得到執(zhí)行結(jié)果。
(D)根據(jù)MappedStatement對(duì)象中的結(jié)果映射配置對(duì)得到的執(zhí)行結(jié)果進(jìn)行轉(zhuǎn)換處理,并得到最終的處理結(jié)果。
(E)釋放連接資源。
(4)返回處理結(jié)果將最終的處理結(jié)果返回。
MyBatis 最強(qiáng)大的特性之一就是它的動(dòng)態(tài)語句功能。如果您以前有使用JDBC或者類似框架的經(jīng)歷,您就會(huì)明白把SQL語句條件連接在一起是多么的痛苦,要確保不能忘記空格或者不要在columns列后面省略一個(gè)逗號(hào)等。動(dòng)態(tài)語句能夠完全解決掉這些痛苦。
四、Dubbo
Dubbo是一個(gè)分布式服務(wù)框架,致力于提供高性能和透明化的RPC(遠(yuǎn)程過程調(diào)用協(xié)議)遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。簡單的說,dubbo就是個(gè)服務(wù)框架,如果沒有分布式的需求,其實(shí)是不需要用的,只有在分布式的時(shí)候,才有dubbo這樣的分布式服務(wù)框架的需求,并且本質(zhì)上是個(gè)服務(wù)調(diào)用的東東,說白了就是個(gè)遠(yuǎn)程服務(wù)調(diào)用的分布式框架。
1、透明化的遠(yuǎn)程方法調(diào)用,就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法,只需簡單配置,沒有任何API侵入。
2、軟負(fù)載均衡及容錯(cuò)機(jī)制,可在內(nèi)網(wǎng)替代F5等硬件負(fù)載均衡器,降低成本,減少單點(diǎn)。
3、 服務(wù)自動(dòng)注冊(cè)與發(fā)現(xiàn),不再需要寫死服務(wù)提供方地址,注冊(cè)中心基于接口名查詢服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者。
節(jié)點(diǎn)角色說明:?
Provider: 暴露服務(wù)的服務(wù)提供方。?
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。?
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。?
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心。?
Container: 服務(wù)運(yùn)行容器。
五、Maven
Maven這個(gè)個(gè)項(xiàng)目管理和構(gòu)建自動(dòng)化工具,越來越多的開發(fā)人員使用它來管理項(xiàng)目中的jar包。但是對(duì)于我們程序員來說,我們最關(guān)心的是它的項(xiàng)目構(gòu)建功能。
六、RabbitMQ
消息隊(duì)列一般是在項(xiàng)目中,將一些無需即時(shí)返回且耗時(shí)的操作提取出來,進(jìn)行了異步處理,而這種異步處理的方式大大的節(jié)省了服務(wù)器的請(qǐng)求響應(yīng)時(shí)間,從而提高了系統(tǒng)的吞吐量。
RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器。
Erlang是一門動(dòng)態(tài)類型的函數(shù)式編程語言。對(duì)應(yīng)到Erlang里,每個(gè)Actor對(duì)應(yīng)著一個(gè)Erlang進(jìn)程,進(jìn)程之間通過消息傳遞進(jìn)行通信。相比共享內(nèi)存,進(jìn)程間通過消息傳遞來通信帶來的直接好處就是消除了直接的鎖開銷(不考慮Erlang虛擬機(jī)底層實(shí)現(xiàn)中的鎖應(yīng)用)。
AMQP(Advanced Message Queue Protocol)定義了一種消息系統(tǒng)規(guī)范。這個(gè)規(guī)范描述了在一個(gè)分布式的系統(tǒng)中各個(gè)子系統(tǒng)如何通過消息交互。
七、Log4j
日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級(jí)別。
八、Ehcache
EhCache 是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是Hibernate中默認(rèn)的CacheProvider。Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級(jí)容器。它具有內(nèi)存和磁盤存儲(chǔ),緩存加載器,緩存擴(kuò)展,緩存異常處理程序,一個(gè)gzip緩存servlet過濾器,支持REST和SOAP api等特點(diǎn)。
優(yōu)點(diǎn):?
1、 快速?
2、 簡單?
3、 多種緩存策略?
4、緩存數(shù)據(jù)有兩級(jí):內(nèi)存和磁盤,因此無需擔(dān)心容量問題?
5、 緩存數(shù)據(jù)會(huì)在虛擬機(jī)重啟的過程中寫入磁盤?
6、可以通過RMI、可插入API等方式進(jìn)行分布式緩存?
7、 具有緩存和緩存管理器的偵聽接口?
8、支持多緩存管理器實(shí)例,以及一個(gè)實(shí)例的多個(gè)緩存區(qū)域?
9、提供Hibernate的緩存實(shí)現(xiàn)
缺點(diǎn):?
1、使用磁盤Cache的時(shí)候非常占用磁盤空間:這是因?yàn)镈iskCache的算法簡單,該算法簡單也導(dǎo)致Cache的效率非常高。它只是對(duì)元素直接追加存儲(chǔ)。因此搜索元素的時(shí)候非常的快。如果使用DiskCache的,在很頻繁的應(yīng)用中,很快磁盤會(huì)滿。
2、 不能保證數(shù)據(jù)的安全:當(dāng)突然kill掉java的時(shí)候,可能會(huì)產(chǎn)生沖突,EhCache的解決方法是如果文件沖突了,則重建cache。這對(duì)于Cache數(shù)據(jù)需要保存的時(shí)候可能不利。當(dāng)然,Cache只是簡單的加速,而不能保證數(shù)據(jù)的安全。如果想保證數(shù)據(jù)的存儲(chǔ)安全,可以使用Bekeley DB Java Edition版本。這是個(gè)嵌入式數(shù)據(jù)庫??梢源_保存儲(chǔ)安全和空間的利用率。
九、Redis
redis是一個(gè)key-value存儲(chǔ)系統(tǒng)。和Memcached類似,它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。
Redis數(shù)據(jù)庫完全在內(nèi)存中,使用磁盤僅用于持久性。相比許多鍵值數(shù)據(jù)存儲(chǔ),Redis擁有一套較為豐富的數(shù)據(jù)類型。Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從服務(wù)器。
1.2、Redis優(yōu)點(diǎn):
(1)異常快速:Redis的速度非??欤棵肽軋?zhí)行約11萬集合,每秒約81000+條記錄。
(2)支持豐富的數(shù)據(jù)類型:Redis支持最大多數(shù)開發(fā)人員已經(jīng)知道像列表,集合,有序集合,散列數(shù)據(jù)類型。這使得它非常容易解決各種各樣的問題,因?yàn)槲覀冎滥男﹩栴}是可以處理通過它的數(shù)據(jù)類型更好。
(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個(gè)客戶端同時(shí)訪問的Redis服務(wù)器將獲得更新后的值。
(4)多功能實(shí)用工具:Redis是一個(gè)多實(shí)用的工具,可以在多個(gè)用例如緩存,消息,隊(duì)列使用(Redis原生支持發(fā)布/訂閱),任何短暫的數(shù)據(jù),應(yīng)用程序,如Web應(yīng)用程序會(huì)話,網(wǎng)頁命中計(jì)數(shù)等。
1.3、Redis缺點(diǎn):?
(1)單線程?
(2)耗內(nèi)存
十、Shiro
Apache Shiro是Java的一個(gè)安全框架,旨在簡化身份驗(yàn)證和授權(quán)。Shiro在JavaSE和JavaEE項(xiàng)目中都可以使用。它主要用來處理身份認(rèn)證,授權(quán),企業(yè)會(huì)話管理和加密等。Shiro的具體功能點(diǎn)如下:
(1)身份認(rèn)證/登錄,驗(yàn)證用戶是不是擁有相應(yīng)的身份;
(2)授權(quán),即權(quán)限驗(yàn)證,驗(yàn)證某個(gè)已認(rèn)證的用戶是否擁有某個(gè)權(quán)限;即判斷用戶是否能做事情,常見的如:驗(yàn)證某個(gè)用戶是否擁有某個(gè)角色。或者細(xì)粒度的驗(yàn)證某個(gè)用戶對(duì)某個(gè)資源是否具有某個(gè)權(quán)限;
(3)會(huì)話管理,即用戶登錄后就是一次會(huì)話,在沒有退出之前,它的所有信息都在會(huì)話中;會(huì)話可以是普通JavaSE環(huán)境的,也可以是如Web環(huán)境的;
(4)加密,保護(hù)數(shù)據(jù)的安全性,如密碼加密存儲(chǔ)到數(shù)據(jù)庫,而不是明文存儲(chǔ);
(5)Web支持,可以非常容易的集成到Web環(huán)境;?
Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率;
(6)shiro支持多線程應(yīng)用的并發(fā)驗(yàn)證,即如在一個(gè)線程中開啟另一個(gè)線程,能把權(quán)限自動(dòng)傳播過去;
(7)提供測(cè)試支持;
(8)允許一個(gè)用戶假裝為另一個(gè)用戶(如果他們?cè)试S)的身份進(jìn)行訪問;
(9)記住我,這個(gè)是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。