java設(shè)計(jì)模式之代理模式(靜態(tài)代理)

??今天給大家分享的是java設(shè)計(jì)模式之代理模式中的靜態(tài)代理模式虹钮,動(dòng)態(tài)代理模式將在后面文章中給出趴酣。如有不足徒探,敬請(qǐng)指正威兜。

一销斟、代理模式是什么

代理模式是面向?qū)ο缶幊痰?23 種基礎(chǔ)設(shè)計(jì)模式之一。

代理模式的定義: 為其他對(duì)象(源對(duì)象) 提供一種代理以控制對(duì)這個(gè)對(duì)象(源對(duì)象) 的訪問牡属。

?需求: DAO 層的代碼操作票堵。我們知道分別有

獲得數(shù)據(jù)庫(kù)連接(相同的)

獲得操作對(duì)象(相同的)

封裝參數(shù)(每個(gè)方法都不同的)

操作(每個(gè)方法都不同的)

關(guān)閉(相同的)

通過代理模式扼睬,將 DAO 的實(shí)現(xiàn)類逮栅,相同的代碼理解放在代理類里面實(shí)現(xiàn)。 我們 DAO 的實(shí)現(xiàn)類只要編寫封裝參數(shù)以及操作就可以了窗宇。

二措伐、代碼示例

2.1 創(chuàng)建一個(gè)原始類接口

package com.xkt.dao; /** * @author lzx * * @param <T> */ public interface DAO<T> { /** * 增加記錄 * * @param entity * @return */ int insert(T entity); /** * 刪除記錄 * * @param id * @return */ int deleteById(Integer id); /** * 查詢記錄 * * @param id * @return */ T findById(Integer id); /** * 記錄 * * @param entity * @return */ int update(T entity); }

2.2 創(chuàng)建一個(gè)原始類

package com.xkt.dao; import com.xkt.pojo.Student; /** * @author lzx * */ public class StudentDAO implements DAO<Student> { @Override public int insert(Student entity) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝插入數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-插入數(shù)據(jù)-" + entity.getStudentName()); return 1; } @Override public int deleteById(Integer id) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝刪除數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-插入數(shù)據(jù)-"); return 1; } @Override public Student findById(Integer id) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝查詢數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-查詢數(shù)據(jù)-"); return null; } @Override public int update(Student entity) { // 3.封裝參數(shù)(每個(gè)方法都不同的) System.out.println("-封裝更新數(shù)據(jù)-"); // 4.操作(每個(gè)方法都不同的) System.out.println("-操作-更新數(shù)據(jù)-"); return 1; } }

2.3 創(chuàng)建一個(gè)代理類

注意:代理類與原始類都需要實(shí)現(xiàn)相同的接口

package com.xkt.proxy; import com.xkt.dao.DAO; import com.xkt.pojo.Student; public class ProxyDAO implements DAO<Student> { private DAO<Student> source; public ProxyDAO(DAO<Student> source) { this.source = source; } @Override public int insert(Student entity) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); int count = source.insert(entity); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return count; } @Override public int deleteById(Integer id) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); int count = source.deleteById(id); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return count; } @Override public Student findById(Integer id) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); Student student = source.findById(id); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return student; } @Override public int update(Student entity) { // 1.獲得數(shù)據(jù)庫(kù)連接(相同的) System.out.println("-獲得數(shù)據(jù)庫(kù)連接-"); // 2.獲得操作對(duì)象(相同的) System.out.println("-獲得操作對(duì)象-"); int count = source.update(entity); // .關(guān)閉(相同的) System.out.println("-關(guān)閉-"); return count; } }

2.4 測(cè)試代碼

package com.xkt.test; import org.junit.Test; import com.xkt.dao.StudentDAO; import com.xkt.pojo.Student; import com.xkt.proxy.ProxyDAO; public class StudentDAOTest { @Test public void insert() { StudentDAO studentDAO = new StudentDAO(); ProxyDAO proxyDAO = new ProxyDAO(studentDAO); Student entity = new Student(); entity.setStudentName("張三"); proxyDAO.insert(entity); } }

三、說(shuō)明

3.1 代理的模式的作用

就是使用一個(gè)代理類來(lái)管理被代理類對(duì)象(源對(duì)象)的統(tǒng)一處理军俊。我們將這種統(tǒng)一處理的理解稱為控制訪問侥加。

3.2 代理模式的缺陷

代理類必須要繼承或者實(shí)現(xiàn)一個(gè)基類或者接口!7喙(很笨重)担败。每個(gè)接口都要實(shí)現(xiàn)一個(gè)新的代理 類。

每個(gè)方法的邏輯處理镰官,還是要重復(fù)編寫提前。

3.3 如何解決代理模式的缺陷

可以使用動(dòng)態(tài)代理模式。

一個(gè)代理類可以代理多個(gè)對(duì)象 泳唠,(不是代理模式一一對(duì)應(yīng))

所有的方法的代碼都可以統(tǒng)一處理狈网。

所謂的動(dòng)態(tài)代理模式,就是可以自由的不指定的使用任何接口來(lái)實(shí)現(xiàn)代理。所謂的動(dòng)態(tài)就不需要指定代理類的固定接口M夭浮S露狻!


加java高級(jí)架構(gòu)師群獲取Java工程化士鸥、高性能及分布式闲孤、高性能、深入淺出础淤。高架構(gòu)崭放。性能調(diào)優(yōu)、Spring鸽凶,MyBatis币砂,Netty源碼分析和大數(shù)據(jù)等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨的直播免費(fèi)學(xué)習(xí)權(quán)限都是大牛帶飛?讓你少走很多的彎路的?群號(hào)是:?798891710對(duì)了?小白勿進(jìn)?最好是有開發(fā)經(jīng)驗(yàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玻侥,隨后出現(xiàn)的幾起案子决摧,更是在濱河造成了極大的恐慌,老刑警劉巖凑兰,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掌桩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姑食,警方通過查閱死者的電腦和手機(jī)波岛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)音半,“玉大人则拷,你說(shuō)我怎么就攤上這事〔莛” “怎么了煌茬?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)彻桃。 經(jīng)常有香客問我坛善,道長(zhǎng),這世上最難降的妖魔是什么邻眷? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任眠屎,我火速辦了婚禮,結(jié)果婚禮上肆饶,老公的妹妹穿的比我還像新娘改衩。我一直安慰自己,他們只是感情好抖拴,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布燎字。 她就那樣靜靜地躺著腥椒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪候衍。 梳的紋絲不亂的頭發(fā)上笼蛛,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音蛉鹿,去河邊找鬼滨砍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妖异,可吹牛的內(nèi)容都是我干的惋戏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼他膳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼响逢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起棕孙,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舔亭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蟀俊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钦铺,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年肢预,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矛洞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烫映,死狀恐怖沼本,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窑邦,我是刑警寧澤擅威,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布壕探,位于F島的核電站冈钦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏李请。R本人自食惡果不足惜瞧筛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望导盅。 院中可真熱鬧较幌,春花似錦、人聲如沸白翻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至岛琼,卻和暖如春底循,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背槐瑞。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工熙涤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人困檩。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓祠挫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悼沿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子等舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,815評(píng)論 0 11
  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子糟趾,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    開心的鑼鼓閱讀 3,325評(píng)論 0 9
  • 設(shè)計(jì)模式分類 總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類:創(chuàng)建型模式软瞎,共五種:工廠方法模式、抽象工廠模式拉讯、單例模式涤浇、建造者模式、原...
    lifeline丿毅閱讀 1,225評(píng)論 0 2
  • DAY 05 1魔慷、 public classArrayDemo { public static void mai...
    周書達(dá)閱讀 689評(píng)論 0 0
  • 喜歡一個(gè)人其實(shí)是一件特別幸福的事情只锭,你知道有一個(gè)人在關(guān)注自己,人與人之間相遇的概率那么低院尔,而自己卻在茫茫人海中遇到...
    學(xué)習(xí)能力閱讀 116評(píng)論 0 0