java設(shè)計(jì)模式之委派模式原理分析
委派模式(Delegate)原理:
類B和類A是兩個(gè)互相沒有任何關(guān)系的類,但是B具有和A一模一樣的方法和屬性;并且調(diào)用B中的方法/屬性就是調(diào)用A中同名的方法和屬性。
B好像就是一個(gè)受A授權(quán)委托的中介,第三方的代碼不需要知道A的存在,也不需要和A發(fā)生直接的聯(lián)系,通過B就可以直接使用A的功能,這樣既能夠使用到A的各種公能,又能夠很好的將A保護(hù)起來。
委派模式使得我們可以用聚合來代替繼承,看如下代碼:
// 類模擬打印機(jī)Printer擁有針式打印機(jī)RealPrinter的實(shí)例 //Printer擁有的方法print()將處理轉(zhuǎn)交給RealPrinter的print()方法 package Paint; class RealPrinter { void print() { System.out.print("something"); } } class Printer { RealPrinter p = new RealPrinter(); // 委派 void print() { p.print(); } } public class Main { public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
執(zhí)行結(jié)果
看代碼,比較容易理解,這是一個(gè)特別簡(jiǎn)單的委派設(shè)計(jì)模式。如果可以使用接口,那委派可以做到類型更安全并且更加靈活。我們看下面這個(gè)例子:
/***在這個(gè)例子里,類C可以委托類A或類B,類C擁有方法使自己可以在類A或類B間選擇。因?yàn)轭怉或類B必須實(shí)現(xiàn)接口I規(guī)定的方法,所以在這里委托是類型安全的。**/ package Paint; interface I { void f(); void g(); } class A implements I { public void f() { System.out.println("A: doing f()"); } public void g() { System.out.println("A: doing g()"); } } class B implements I { public void f() { System.out.println("B: doing f()"); } public void g() { System.out.println("B: doing g()"); } } class C implements I { I i = new A(); public void f() { i.f(); } public void g() { i.g(); } public void toA() { i = new A(); } public void toB() { i = new B(); } } public class Main { public static void main(String[] args) { C c = new C(); c.f(); // output: A: doing f() c.g(); // output: A: doing g() c.toB(); // 更換委托對(duì)象 c.f(); // output: B: doing f() c.g(); // output: B: doing g() } }
委托的缺點(diǎn):代碼量大,類更多。
----- delegate委派模式和Proxy代理模式 -----
Proxy :譯為代理, 被代理方(B)與代理方(A)的接口完全一致。
主要使用場(chǎng)景:為簡(jiǎn)化編程(或無法操作B)而把請(qǐng)求交給代理方(A),由代理方與被代理方進(jìn)行通信,以完成請(qǐng)求。
Delegete : 譯為委托
主要使用場(chǎng)景:一件事情(或一個(gè)請(qǐng)求)對(duì)象本身不知道怎樣處理,對(duì)象把請(qǐng)求交給其它對(duì)象來做。
簡(jiǎn)單來講,可以這么理解,代理是若干個(gè)對(duì)象實(shí)現(xiàn)了一個(gè)共同的接口,而委派只是說明一個(gè)對(duì)象引用了另一個(gè)對(duì)象,并不牽扯接口。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java設(shè)計(jì)模式筆記之裝飾模式
- Java設(shè)計(jì)模式之裝飾模式原理與用法實(shí)例詳解
- java設(shè)計(jì)模式學(xué)習(xí)之裝飾模式
- Java設(shè)計(jì)模式之代理模式與裝飾模式實(shí)例詳解
- Java設(shè)計(jì)模式之裝飾模式(Decorator模式)介紹
- java設(shè)計(jì)模式之裝飾模式詳細(xì)介紹
- Java設(shè)計(jì)模式單例模式(Singleton)用法解析
- Java設(shè)計(jì)模式模板方法(Template)原理解析
- java 設(shè)計(jì)模式之依賴倒置實(shí)例詳解
- Java設(shè)計(jì)模式模板方法模式(Template)用法解析
- Java設(shè)計(jì)模式 模板模式及應(yīng)用場(chǎng)景解析
- Java通俗易懂系列設(shè)計(jì)模式之裝飾模式
相關(guān)文章
java datetime數(shù)據(jù)類型去掉時(shí)分秒的案例詳解
在Java中,如果我們想要表示一個(gè)日期而不包括時(shí)間(時(shí)分秒),我們通常會(huì)使用java.time包中的LocalDate類,這篇文章主要介紹了java datetime數(shù)據(jù)類型去掉時(shí)分秒,需要的朋友可以參考下2024-06-06SpringBoot中如何進(jìn)行統(tǒng)一異常處理
大家好,本篇文章主要講的是SpringBoot中如何進(jìn)行統(tǒng)一異常處理,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解,CGLIB是強(qiáng)大的、高性能的代碼生成庫,被廣泛應(yīng)用于AOP框架,它底層使用ASM來操作字節(jié)碼生成新的類,為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪問,需要的朋友可以參考下2023-11-11Java實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法,文中通過一個(gè)示例帶大家具體了解了實(shí)現(xiàn)的方法,需要的可以參考一下2022-08-08java設(shè)計(jì)模式理解依賴于抽象不依賴具體的分析
這篇文章主要為大家介紹了java設(shè)計(jì)模式的規(guī)則,理解依賴于抽象不依賴具體的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10詳解spring boot應(yīng)用啟動(dòng)原理分析
這篇文章主要介紹了詳解spring boot應(yīng)用啟動(dòng)原理分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06IDEA2020 Plugins不能用的解決辦法及Plugins 搜索不了插件的問題
這篇文章主要介紹了IDEA2020 Plugins不能用的解決辦法,文中給大家介紹了Intellij IDEA 2020.1 的Plugins 搜索不了插件,連接超時(shí)的問題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-06-06解決Java字符串JSON轉(zhuǎn)換異常:cn.hutool.json.JSONException:?Mismatched?
這篇文章主要給大家介紹了關(guān)于如何解決Java字符串JSON轉(zhuǎn)換異常:cn.hutool.json.JSONException:?Mismatched?hr?and?body的相關(guān)資料,文中將解決的辦法通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01