Java設(shè)計(jì)模式之橋接模式的示例詳解
定義
橋梁模式是對象的結(jié)構(gòu)模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。橋梁模式的用意是“將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化”。
案例
需求
通過企業(yè)微信和qq的方式給員工發(fā)送消息
方案一
定義發(fā)送消息的接口
/** * 發(fā)送消息的接口 * @author:liyajie * @createTime:2022/2/21 10:33 * @version:1.0 */ public interface AbstractSendMsgService { // 發(fā)送消息 public void sendMsg(); }
定義普通消息接口
/** * 普通消息接口 * @author:liyajie * @createTime:2022/2/21 11:32 * @version:1.0 */ public interface CommonMsg extends AbstractSendMsgService{ }
定義微信消息實(shí)現(xiàn)類
/** * 發(fā)送消息的實(shí)現(xiàn)接口 * @author:liyajie * @createTime:2022/2/21 10:35 * @version:1.0 */ public class WxMsgServiceImpl implements CommonMsg{ @Override public void sendMsg() { System.out.println("老板使用微信給你發(fā)了消息,快去接收吧"); } }
定義QQ消息實(shí)現(xiàn)類
/** * 發(fā)送消息的實(shí)現(xiàn)接口 * @author:liyajie * @createTime:2022/2/21 10:35 * @version:1.0 */ public class QqMsgServiceImpl implements CommonMsg{ @Override public void sendMsg() { System.out.println("老板使用QQ給你發(fā)了消息,快去接收吧"); } }
定義測試類
/** * 測試類 * @author:liyajie * @createTime:2022/2/21 10:37 * @version:1.0 */ public class Test { public static void main(String[] args) { new WxMsgServiceImpl().sendMsg(); new QqMsgServiceImpl().sendMsg(); } }
測試結(jié)果
方案二
定義發(fā)送消息抽象接口
/** * 發(fā)送消息的抽象接口 * @author:liyajie * @createTime:2022/2/21 10:33 * @version:1.0 */ public abstract class NewAbstractSendMsgService { protected SendMsgImplementor sendMsgImplementor; public NewAbstractSendMsgService(SendMsgImplementor sendMsgImplementor){ this.sendMsgImplementor = sendMsgImplementor; } // 微信 public void sendMsg(){ this.sendMsgImplementor.sendMsg(); } }
定義發(fā)送消息實(shí)現(xiàn)類
/** * 發(fā)送消息的實(shí)現(xiàn)接口 * @author:liyajie * @createTime:2022/2/21 10:35 * @version:1.0 */ public class NewSendMsgServiceImpl extends NewAbstractSendMsgService{ public NewSendMsgServiceImpl(SendMsgImplementor sendMsgImplementor) { super(sendMsgImplementor); } @Override public void sendMsg() { super.sendMsg(); } }
定義發(fā)送消息統(tǒng)一接口
/** * 發(fā)送消息統(tǒng)一接口 * @author:liyajie * @createTime:2022/2/21 10:41 * @version:1.0 */ public interface SendMsgImplementor { void sendMsg(); }
定義微信發(fā)送消息實(shí)現(xiàn)類
/** * 微信發(fā)送消息 * @author:liyajie * @createTime:2022/2/21 10:45 * @version:1.0 */ public class WxImplementor implements SendMsgImplementor{ @Override public void sendMsg() { System.out.println("老板使用微信給你發(fā)了消息,快去接收吧"); } }
定義QQ發(fā)送消息實(shí)現(xiàn)類
/** * QQ發(fā)送消息 * @author:liyajie * @createTime:2022/2/21 10:45 * @version:1.0 */ public class QqImplementor implements SendMsgImplementor{ @Override public void sendMsg() { System.out.println("老板使用QQ給你發(fā)了消息,快去接收吧"); } }
定義測試類
/** * 測試類 * @author:liyajie * @createTime:2022/2/21 10:37 * @version:1.0 */ public class TestNew { public static void main(String[] args) { NewSendMsgServiceImpl newSendMsgService = new NewSendMsgServiceImpl(new QqImplementor()); newSendMsgService.sendMsg(); NewSendMsgServiceImpl newSendMsgService2 = new NewSendMsgServiceImpl(new WxImplementor()); newSendMsgService2.sendMsg(); } }
測試結(jié)果
對比分析
方案一,即一般實(shí)現(xiàn)方式,微信和QQ兩種發(fā)送消息的方式需要同時(shí)去實(shí)現(xiàn)CommonMsg和AbstractSendMsgService兩個接口中的方法,耦合性較高;另外比如新增緊急消息的發(fā)送或者新增短信的方式發(fā)送消息的需求,改動較多,擴(kuò)展性較差。
方案二,為橋接模式實(shí)現(xiàn)方式,在消息類的構(gòu)造方法中傳入接口SendMsgImplementor,從而使發(fā)送消息的抽象和具體實(shí)現(xiàn)進(jìn)行了分離,實(shí)現(xiàn)了解耦;后期新增緊急消息的發(fā)送或者新增短信的方式發(fā)送消息的需求,也只需要新增緊急消息類和短信發(fā)送類即可,和QQ,微信等發(fā)送消息互不影響,擴(kuò)展方便,符合開閉原則,復(fù)用原則。
總結(jié)
橋梁模式分離了抽象部分和實(shí)現(xiàn)部分,從而極大地提供了系統(tǒng)的靈活性。讓抽象部分和實(shí)現(xiàn)部分獨(dú)立出來,分別定義接口,這有助于對系統(tǒng)進(jìn)行分層,從而產(chǎn)生更好的結(jié)構(gòu)化的系統(tǒng)。
橋梁模式使得抽象部分和實(shí)現(xiàn)部分可以分別獨(dú)立地?cái)U(kuò)展,而不會相互影響,從而大大提高了系統(tǒng)的可擴(kuò)展性。
到此這篇關(guān)于Java設(shè)計(jì)模式之橋接模式的示例詳解的文章就介紹到這了,更多相關(guān)Java橋接模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java虛擬機(jī)類加載器之雙親委派機(jī)制模型案例
這篇文章主要介紹了Java虛擬機(jī)類加載器之雙親委派機(jī)制模型案例,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Spring?Cloud實(shí)現(xiàn)灰度發(fā)布的示例代碼
這篇文章主要為大家詳細(xì)介紹了Spring?Cloud實(shí)現(xiàn)灰度發(fā)布的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-09-09SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào))
這篇文章主要介紹了SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào)),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10MyBatis如何使用PageHelper實(shí)現(xiàn)分頁查詢
這篇文章主要介紹了MyBatis如何使用PageHelper實(shí)現(xiàn)分頁查詢,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程
循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下2022-02-02Java中java.lang.ClassCastException異常原因以及解決方法詳解
這篇文章主要給大家介紹了關(guān)于Java中java.lang.ClassCastException異常原因以及解決方法的相關(guān)資料,ClassCastException從字面上看是類型轉(zhuǎn)換錯誤,通常是進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí)候出的錯誤,需要的朋友可以參考下2024-02-02Java去掉小數(shù)點(diǎn)后面無效0的方案與建議
當(dāng)前小數(shù)點(diǎn)后面的位數(shù)過多的時(shí)候,多余的0沒有實(shí)際意義,下面這篇文章主要給大家介紹了關(guān)于Java去掉小數(shù)點(diǎn)后面無效0的方案與建議,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07