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