最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java設(shè)計(jì)模式--橋接模式詳解

 更新時(shí)間:2021年07月19日 17:16:09   作者:吾仄lo咚鏘  
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之橋接模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助

引例

需求:對不同手機(jī)類型的不同品牌(比如按鍵手機(jī):諾基亞、翻蓋手機(jī):紐曼、智能手機(jī):華為、小米)實(shí)現(xiàn)操作編程(比如: 開機(jī)、關(guān)機(jī)、打電話)。

先來說說一般解法:將不同手機(jī)類型繼承父類手機(jī),最后各個(gè)品牌再繼承對應(yīng)手機(jī)類型:

在這里插入圖片描述

弊端:乍一看沒問題,但其實(shí)不易擴(kuò)展(類爆炸),如果增加新的手機(jī)類型(比如新興的折疊式),就需要增加各個(gè)手機(jī)品牌的類去繼承(比如已繼承智能手機(jī)的華為小米)。同樣如果我們增加一個(gè)手機(jī)品牌,也要在各個(gè)手機(jī)樣式類下增加。違反了單一職責(zé)原則,維護(hù)成本高。

解決方案就是下面的主角:橋接模式。

橋接模式

橋接模式(Bridge)是一種結(jié)構(gòu)型設(shè)計(jì)模式。顧名思義,就像搭個(gè)橋連接起來,通過使用封裝、聚合及繼承等行為讓不同的類承擔(dān)不同的職責(zé),將實(shí)現(xiàn)與抽象放在兩個(gè)不同的類層次中,使兩個(gè)層次可以獨(dú)立改變,保持各部分的獨(dú)立性以及應(yīng)對他們的功能擴(kuò)展。

原理類圖:

在這里插入圖片描述

  • Client類:客戶端調(diào)用
  • Abstraction抽象類:充當(dāng)橋接類,維護(hù)了Implementor接口(即它的實(shí)現(xiàn)類ConcreteImplementorA…)
  • RefindAbstraction類:是抽象類的子類
  • Implementor接口:行為實(shí)現(xiàn)接口
  • ConcreteImplementorA/B類:行為的具體實(shí)現(xiàn)類

從UML類圖看出,抽象類和接口是聚合的關(guān)系,即調(diào)用和被調(diào)用的關(guān)系。如此一來搭好橋后,具體實(shí)現(xiàn)類調(diào)用方法=》父類抽象類的方法=》行為接口方法=》具體接口行為實(shí)現(xiàn)類,以完成連接,同時(shí)兩者又相互獨(dú)立易擴(kuò)展:

在這里插入圖片描述

實(shí)戰(zhàn)示例

用橋接模式來解決引例的實(shí)際問題。

類圖:

在這里插入圖片描述

代碼:

//接口
public interface Brand {
	void open(); //開機(jī)
	void close(); //關(guān)機(jī)
	void call();//打電話
}
//接口實(shí)現(xiàn)類
public class NOKIA implements Brand{
    @Override
    public void open() {
        System.out.println("諾基亞手機(jī)開機(jī)");
    }
    @Override
    public void close() {
        System.out.println("諾基亞手機(jī)關(guān)機(jī)");
    }
    @Override
    public void call() {
        System.out.println("諾基亞手機(jī)打電話");
    }
}
public class Newsmy implements Brand{
    @Override
    public void open() {
        System.out.println("紐曼手機(jī)開機(jī)");
    }
    @Override
    public void close() {
        System.out.println("紐曼手機(jī)關(guān)機(jī)");
    }
    @Override
    public void call() {
        System.out.println("紐曼手機(jī)打電話");
    }
}
public class Huawei implements Brand{
    @Override
    public void open() {
        System.out.println("華為手機(jī)開機(jī)");
    }
    @Override
    public void close() {
        System.out.println("華為手機(jī)關(guān)機(jī)");
    }
    @Override
    public void call() {
        System.out.println("華為手機(jī)打電話");
    }
}
public class Xiaomi implements Brand{
    @Override
    public void open() {
        System.out.println("小米手機(jī)開機(jī)");
    }
    @Override
    public void close() {
        System.out.println("小米手機(jī)關(guān)機(jī)");
    }
    @Override
    public void call() {
        System.out.println("小米手機(jī)打電話");
    }
}
//抽象類
public abstract class Phone {
	private Brand brand;//手機(jī)品牌接口
	public Phone(Brand brand) {//構(gòu)造器
		super();
		this.brand = brand;
	}
	public void open() {
		this.brand.open();
	}
	public void close() {
		this.brand.close();
	}
	public void call() { this.brand.call(); }
}
//抽象子類
public class ButtonPhone extends Phone{
    public ButtonPhone(Brand brand) {
        super(brand);
    }
    public void open() {
        super.open();
        System.out.println("按鍵手機(jī)");
    }
    public void close() {
        super.close();
        System.out.println("按鍵手機(jī)");
    }
    public void call() {
        super.call();
        System.out.println("按鍵手機(jī)");
    }
}
public class SlidePhone extends Phone{
    public SlidePhone(Brand brand) {
        super(brand);
    }
    public void open() {
        super.open();
        System.out.println("翻蓋手機(jī)");
    }
    public void close() {
        super.close();
        System.out.println("翻蓋手機(jī)");
    }
    public void call() {
        super.call();
        System.out.println("翻蓋手機(jī)");
    }
}
public class SmartPhone  extends Phone{
    public SmartPhone(Brand brand) {
        super(brand);
    }
    public void open() {
        super.open();
        System.out.println("智能手機(jī)");
    }
    public void close() {
        super.close();
        System.out.println("智能手機(jī)");
    }
    public void call() {
        super.call();
        System.out.println("智能手機(jī)");
    }
}
//客戶端調(diào)用
public class Client {
    public static void main(String[] args) {
        Phone phone1 = new ButtonPhone(new NOKIA());
        phone1.open();
        phone1.call();
        phone1.close();
        System.out.println("=======================");
        Phone phone2 = new SlidePhone(new Newsmy());
        phone2.open();
        phone2.call();
        phone2.close();
        System.out.println("=======================");
        Phone phone3 = new SmartPhone(new Huawei());
        phone3.open();
        phone3.call();
        phone3.close();
    }
}

在這里插入圖片描述

總結(jié)

  • 實(shí)現(xiàn)了抽象和實(shí)現(xiàn)部分的分離,從而極大的提供了系統(tǒng)的靈活性,讓抽象部分和實(shí)現(xiàn)部分獨(dú)立開來,這有助于系統(tǒng)進(jìn)行分層設(shè)計(jì),從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)。
  • 橋接模式替代多層繼承方案,可以減少子類的個(gè)數(shù),降低系統(tǒng)的管理和維護(hù)成本。
  • 橋接模式的引入增加了系統(tǒng)的理解和設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)和編程
  • 常見的應(yīng)用場景: -JDBC驅(qū)動程序

-銀行轉(zhuǎn)賬系統(tǒng)

轉(zhuǎn)賬分類: 網(wǎng)上轉(zhuǎn)賬,柜臺轉(zhuǎn)賬,AMT轉(zhuǎn)賬

轉(zhuǎn)賬用戶類型:普通用戶,銀卡用戶,金卡用戶…

 -消息管理

消息類型:即時(shí)消息,延時(shí)消息

消息分類:手機(jī)短信,郵件消息,QQ消息…

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java生成二維碼的2種實(shí)現(xiàn)方法

    Java生成二維碼的2種實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Java生成二維碼的2種實(shí)現(xiàn)方法,二維碼的實(shí)質(zhì)就是一個(gè)鏈接地址,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 使用Java Collections實(shí)現(xiàn)集合排序的全面指南

    使用Java Collections實(shí)現(xiàn)集合排序的全面指南

    在Java編程中,集合(Collection)是處理數(shù)據(jù)的重要工具之一,Java集合框架提供了豐富的接口和類來操作數(shù)據(jù)集合,而排序是其中最常見的操作之一,本文將詳細(xì)介紹如何使用Collections類對集合進(jìn)行排序,并深入探討其背后的原理和使用場景,需要的朋友可以參考下
    2025-02-02
  • Java實(shí)現(xiàn)的自定義類加載器示例

    Java實(shí)現(xiàn)的自定義類加載器示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的自定義類加載器,結(jié)合具體實(shí)例形式分析了java自定義類加載器的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Windows同時(shí)配置兩個(gè)jdk環(huán)境變量的操作步驟

    Windows同時(shí)配置兩個(gè)jdk環(huán)境變量的操作步驟

    Java Development Kit (JDK) 是開發(fā)Java應(yīng)用程序的基礎(chǔ),包含了編譯器、調(diào)試器以及其他必要的工具,本指南將一步步指導(dǎo)您完成在Windows操作系統(tǒng)上同時(shí)配置兩個(gè)jdk環(huán)境變量的操作步驟,需要的朋友可以參考下
    2024-09-09
  • 關(guān)于java.io.EOFException產(chǎn)生的原因以及解決方案

    關(guān)于java.io.EOFException產(chǎn)生的原因以及解決方案

    文章總結(jié):EOFException異常通常發(fā)生在嘗試從空的ObjectInputStream對象中讀取數(shù)據(jù)時(shí),解決方法是在finally語句中添加判斷,確保objectInputStream不為空后再進(jìn)行關(guān)閉操作,在處理1.txt文件為空的情況時(shí),捕獲EOFException可以避免程序終止,并且不會拋出空指針異常
    2025-01-01
  • 細(xì)品Java8中hashCode方法的使用

    細(xì)品Java8中hashCode方法的使用

    這篇文章主要介紹了細(xì)品Java8中hashCode方法的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說明

    運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說明

    這篇文章主要介紹了運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實(shí)現(xiàn)HttpGet請求傳body參數(shù)

    Java實(shí)現(xiàn)HttpGet請求傳body參數(shù)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HttpGet請求傳body參數(shù)的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • RabbitMQ消息隊(duì)列之持久化機(jī)制詳解

    RabbitMQ消息隊(duì)列之持久化機(jī)制詳解

    這篇文章主要介紹了RabbitMQ消息隊(duì)列之持久化機(jī)制詳解,持久化,即將原本存在于內(nèi)存中的數(shù)據(jù)寫入到磁盤上永久保存數(shù)據(jù),防止服務(wù)宕機(jī)時(shí)內(nèi)存數(shù)據(jù)的丟失,Rabbitmq 的持久化分為隊(duì)列持久化、消息持久化和交換器持久化,需要的朋友可以參考下
    2023-08-08
  • java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解

    java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解

    這篇文章主要介紹了java通過Idea遠(yuǎn)程一鍵部署springboot到Docker詳解,Idea是Java開發(fā)利器,springboot是Java生態(tài)中最流行的微服務(wù)框架,docker是時(shí)下最火的容器技術(shù),那么它們結(jié)合在一起會產(chǎn)生什么化學(xué)反應(yīng)呢?的相關(guān)資料
    2019-06-06

最新評論

莱州市| 仙居县| 会东县| 长岛县| 合川市| 宾阳县| 名山县| 平远县| 衢州市| 马公市| 连平县| 广平县| 赤壁市| 襄垣县| 宁南县| 贡嘎县| 团风县| 潮安县| 读书| 岳阳市| 固阳县| 潍坊市| 赤水市| 富顺县| 泽库县| 曲沃县| 南靖县| 博湖县| 栾城县| 瓮安县| 五家渠市| 徐汇区| 正阳县| 法库县| 都昌县| 于都县| 承德市| 阳信县| 长治市| 容城县| 岳阳县|