基于枚舉實現的橋接模式

基于枚舉實現的橋接模式

這里是基于枚舉方式來維護的橋接模式,維護抽象化和實現化的關系。

橋接模式的應用場景:
當一個類內部具備兩種或多種變化維度時,使用橋接模式可以解耦這些變化的維度,使高層代碼架構穩定。

橋接模式通常適用于以下場景。
1.當一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展時。
2.當一個系統不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加時。
3.當一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性時。
4.橋接模式的一個常見使用場景就是替換繼承。我們知道,繼承擁有很多優點,比如,抽象、封裝、多態等,父類封裝共性,子類實現特性。繼承可以很好的實現代碼復用(封裝)的功能,但這也是繼承的一大缺點。因為父類擁有的方法,子類也會繼承得到,無論子類需不需要,這說明繼承具備強侵入性(父類代碼侵入子類),同時會導致子類臃腫。


文章目錄

  • 基于枚舉實現的橋接模式
      • 前言
  • 一、實例化接口
    • 1.1.實例化接口(顏色)
    • 1.2. 藍色實現實例化接口(藍色)
    • 1.3. 紅色實現實例化接口(紅色)
    • 1.4.白色實現實例化接口(白色)
    • 1.5.粉色實現實例化接口(粉色)
  • 二、使用枚舉維護實例化接口
  • 三、抽象化接口(包的款式)
    • 3.1.雙肩包實現抽象化接口(雙肩包)
    • 3.2.腰包實現抽象化接口(腰包)
    • 3.3.手提包實現抽象化接口(手提包)
  • 四、使用枚舉維護抽象化接口
  • 五、使用枚舉實現的橋接設計測試
  • 總結


前言

用橋接(Bridge)模式模擬女士皮包的選購。

1.女士皮包有很多種,可以按用途分、按皮質分、按品牌分、按顏色分、按大小分等,存在多個維度的變化,所以采用橋接模式來實現女士皮包的選購比較合適。

2.本實例按用途分可選腰包(FannyPack)和手提包(HandBag),按顏色分可選藍色(Bule)和紅色(Red)。可以按兩個維度定義為顏色類和包類。

顏色類(Color)是一個維度,定義為實現化角色,它有兩個具體實現化角色:黃色和紅色,通過getDesc()方法可以選擇顏色;包類(Bag)是另一個維度,定義為抽象化角色,它有兩個擴展抽象化角色:挎包和錢包,它包含了顏色類對象,通過getName() 方法可以選擇相關顏色的挎包和錢包。

一、實例化接口

1.1.實例化接口(顏色)

代碼如下(示例):

package com.jareny.jave.design.bridge.impl;public interface Implementor {public void OperationImpl(String name);}

1.2. 藍色實現實例化接口(藍色)

代碼如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class BueImplementor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.Blue;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}}

1.3. 紅色實現實例化接口(紅色)

代碼如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class RedImplementor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.Red;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}

1.4.白色實現實例化接口(白色)

代碼如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class WhiteImplmentor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.White;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}

1.5.粉色實現實例化接口(粉色)

代碼如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class PinkImplementor implements Implementor {// 指定 顏色的類型private ColourEnum colourEnum = ColourEnum.Pink;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}

二、使用枚舉維護實例化接口

代碼如下(示例):

package com.jareny.jave.design.bridge.enums;import com.jareny.jave.design.bridge.impl.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;/*** 顏色*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ColourEnum {/*** 顏色分類*/Blue("藍色"){@Overridepublic Implementor getImplementor() {return new BueImplementor();}},Red("紅色"){@Overridepublic Implementor getImplementor() {return new RedImplementor();}},White("白色"){@Overridepublic Implementor getImplementor() {return new WhiteImplmentor();}},Pink("粉色"){@Overridepublic Implementor getImplementor() {return new PinkImplementor();}},;// 描述private String desc;public abstract Implementor getImplementor();
}

三、抽象化接口(包的款式)

3.1.雙肩包實現抽象化接口(雙肩包)

代碼如下(示例):

package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class BackpackAbstraction extends Abstraction {// 指定 枚舉類型BagsEnum bagsEnum = BagsEnum.Backpack;public BackpackAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 橋接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}

3.2.腰包實現抽象化接口(腰包)

代碼如下(示例):

package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class FannyPackAbstraction extends Abstraction {// 指定 枚舉類型BagsEnum bagsEnum = BagsEnum.FannyPack;public FannyPackAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 橋接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}

3.3.手提包實現抽象化接口(手提包)

代碼如下(示例):

package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class HandbagAbstraction extends Abstraction {// 指定 枚舉類型BagsEnum bagsEnum = BagsEnum.Handbag;public HandbagAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 橋接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}

四、使用枚舉維護抽象化接口

代碼如下(示例):

package com.jareny.jave.design.bridge.enums;import com.google.common.collect.Lists;
import com.jareny.jave.design.bridge.abstraction.Abstraction;
import com.jareny.jave.design.bridge.abstraction.BackpackAbstraction;
import com.jareny.jave.design.bridge.abstraction.FannyPackAbstraction;
import com.jareny.jave.design.bridge.abstraction.HandbagAbstraction;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum BagsEnum {/*** 包分類*/Handbag("手提包"){@Overridepublic Abstraction getAbstraction() {return new HandbagAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.values());}},Backpack("雙肩包"){@Overridepublic Abstraction getAbstraction() {return new BackpackAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.Pink);}},FannyPack("腰包"){@Overridepublic Abstraction getAbstraction() {return new FannyPackAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.White);}},;private String name;// 獲取抽象public abstract Abstraction getAbstraction();// 獲取實現化列表public abstract List<ColourEnum> getColourList();}

五、使用枚舉實現的橋接設計測試

運行結果

package com.jareny.jave.design.bridge;import com.jareny.jave.design.bridge.abstraction.Abstraction;
import com.jareny.jave.design.bridge.enums.BagsEnum;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class BridgeExample {public static void main(String[] args) {// 獲取所有抽象化列表List<Abstraction> abstractionList = Stream.of(BagsEnum.values()).map(BagsEnum::getAbstraction).collect(Collectors.toList());// 所有抽象化列表開始操作abstractionList.forEach(abstraction ->{System.out.println("======= 輸出橋接后的結果 ======= ");abstraction.Operation();System.out.println("");});}
}
======= 輸出橋接后的結果 ======= 
藍色:手提包
紅色:手提包
白色:手提包
粉色:手提包======= 輸出橋接后的結果 ======= 
紅色:雙肩包
藍色:雙肩包
粉色:雙肩包======= 輸出橋接后的結果 ======= 
紅色:腰包
藍色:腰包
白色:腰包

總結

本文僅通過使用枚舉的方式來來維護實例化接口、抽象化接口,同時使用枚舉來維護抽象化和實例化之前的關系,通過掃描枚舉的方式來獲取到所有的抽象化和實例化橋接的結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162617.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【微信小程序】繪制二維碼實現及解決canvas層級問題最佳實踐

前言 很久沒寫微信小程序的需求了&#xff0c;今天來活兒要做個二維碼掃碼相關的需求&#xff0c;本來以為是灑灑水的事情&#xff0c;誰知道也折磨了大半天&#xff0c;今天特此記錄一下~ 需求&#xff1a;點擊按鈕&#xff0c;彈出二維碼&#xff0c;二維碼內容固定為test …

獨孤思維:不喜愛的再賺錢也別碰,因為你愛無能

很多人都說什么工作收入高做什么&#xff1b; 很多女人說哪個男人有錢嫁哪個&#xff1b; 很多粉絲說什么項目賺錢做什么。 本質上不是你愛這個工作&#xff0c;愛這個男人&#xff0c;愛這個項目。 而是你愛錢。 但是愛錢&#xff0c;要付出代價。 工作收入高&#xff0…

Dubbo框架

1&#xff1a;簡介 Dubbo 是阿里巴巴公司開源的一個Java高性能優秀的服務框架 Apache Dubbo 是一款 RPC 服務開發框架&#xff0c;用于解決微服務架構下的服務治理與通信問題 這是Dubbo官網的介紹&#xff0c;下面是我對這dubbo的理解 首先介紹下什么是RPC&#xff1a; 常…

為什么說品牌低價不是一件好事

消費者貨比三價為的是買到低價質優的產品&#xff0c;而網絡電商平臺的公開&#xff0c;也促進了消費者及品牌進行比價&#xff0c;那品牌低價一定就是好事嗎&#xff0c;一定會拉高品牌銷量嗎。其實是不一定的&#xff0c;低價意味著成本的降低&#xff0c;也可能滋生很多產品…

【精選】改進的YOLOv5:紅外遙感圖像微型目標的高效識別系統

1.研究背景與意義 隨著科技的不斷發展&#xff0c;紅外遙感技術在軍事、安防、環境監測等領域中得到了廣泛應用。紅外遙感圖像具有獨特的優勢&#xff0c;可以在夜間或惡劣天氣條件下獲取目標信息&#xff0c;因此在小目標檢測方面具有重要的應用價值。然而&#xff0c;由于紅…

專注短視頻賬號矩陣系統源頭開發---saas工具

專注短視頻賬號矩陣系統源頭開發---saas營銷化工具&#xff0c;目前我們作為一家純技術開發團隊目前已經專注打磨開發這套系統企業版/線下版兩個版本的saas營銷拓客工具已經3年了&#xff0c;本套系統邏輯主要是從ai智能批量剪輯、賬號矩陣全托管發布、私信觸單收錄、文案ai智能…

微服務實戰系列之簽名Sign

前言 昨日恰逢“小雪”節氣&#xff0c;今日寒風如約而至。清晨的馬路上&#xff0c;除了洋洋灑灑的落葉&#xff0c;就是熙熙攘攘的上班族。眼看著&#xff0c;暖冬愈明顯了&#xff0c;葉子來不及泛黃就告別了樹。變化總是在不經意中發生&#xff0c;容不得半刻糊涂。 上集博…

kubernetes 部署 spinnaker

spinnaker簡介 Spinnaker 是一個開源、多云持續交付平臺&#xff0c;它將強大而靈活的管道管理系統與主要云提供商的集成相結合。Spinnaker 提供應用程序管理和部署&#xff0c;幫助您快速、自信地發布軟件變更。 Spinnaker 提供了兩組核心的功能&#xff1a; 應用管理與應用程…

從根到葉:隨機森林模型的深入探索

一、說明 在本綜合指南中&#xff0c;我們將超越基礎知識。當您盯著隨機森林模型的文檔時&#xff0c;您將不再對“節點雜質”、“加權分數”或“成本復雜性修剪”等術語感到不知所措。相反&#xff0c;我們將剖析每個參數&#xff0c;闡明其作用和影響。通過理論和 Python 實踐…

Navicat 技術指引 | 適用于 GaussDB 的備份與還原功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

如何評估供應商協同平臺的功能和性能

在制造業中&#xff0c;供應商協同平臺是一種重要的工具&#xff0c;可以幫助企業與供應商建立更緊密的合作關系&#xff0c;提高采購效率&#xff0c;降低成本。而SRM系統是一種集成的供應鏈管理系統&#xff0c;可以協調和管理企業與供應商之間的業務關系&#xff0c;包括供應…

【lodash】 關于Some的相關用法

1. 判斷集合某個字段是否存在小于0 的 使用 lodash 庫的 some 函數可以用來判斷集合中某個字段是否存在小于 0 的值。你可以使用以下代碼實現&#xff1a; const _ require(lodash);const collection [{ id: 1, value: 10 },{ id: 2, value: -5 },{ id: 3, value: 20 }, ];…

Sealos 云操作系統私有化部署教程

Sealos 私有云已經正式發布了&#xff0c;它為企業用云提供了一種革命性的新方案。Sealos 的核心優勢在于&#xff0c;它允許企業在自己的機房中一鍵構建一個功能與 Sealos 公有云完全相同的私有云。這意味著企業可以在自己的控制和安全范圍內&#xff0c;享受到公有云所提供的…

OTP語音芯片WTN6xxx-8S與Flash語音芯片WT588F02B-8S的區別與應用選擇

隨著科技的快速發展&#xff0c;語音芯片已經成為了電子產品中不可或缺的一部分。唯創知音作為知名的語音芯片制造商&#xff0c;推出了OTP語音芯片WTN6xxx-8S和Flash語音芯片WT588F02B-8S兩款產品。本文將對比這兩款芯片的區別&#xff0c;以幫助讀者更好地選擇適合的語音芯片…

高通OTA升級方案介紹

高通OTA升級方案介紹 1. 高通LE OTA1.1 背景1.2 Recovery系統 2. SDX12 OTA方案3 OTA包的加密 3UK Penetration Test對于OTA升級也有嚴格的安全要求&#xff0c;下面是幾條用例要求&#xff1a; Firmware: A sufficiently strong signing key MUST be in use. Signing keys MUS…

了解消息隊列的五大痛點

文章字數&#xff1a;400字&#xff0c;建議閱讀時間&#xff1a;3分鐘&#xff0c;閱讀難度&#xff1a;中等。 解決消息隊列的五大痛點 在分布式系統中&#xff0c;消息隊列&#xff08;MQ&#xff09;是一種重要的組件&#xff0c;它能夠幫助我們處理并發和異步的問題。然…

visionOS空間計算實戰開發教程Day 6 拖拽和點擊

在之前的學習中我們在空間中添加了3D模型&#xff0c;但在初始擺放后就無法再對其進行移動或做出修改。本節我們在??Day 5??顯示和隱藏的基礎上讓我們模型可以實現拖拽效果&#xff0c;同時對純色的立方體實現點擊隨機換色的功能。 首先是入口文件&#xff0c;無需做出改變…

Linux反彈SHell與檢測思路

免責聲明 文章僅做經驗分享用途,利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,作者不為此承擔任何責任,一旦造成后果請自行承擔!!! 反彈shell payload在線生成 https://www.chinabaiker.com/Hack-Tools/ Online - Reverse Shell G…

Talk | UCSB博士生宋珍巧:基于人工智能的功能性蛋白質設計

本期為TechBeat人工智能社區第549期線上Talk。 北京時間11月22日(周三)20:00&#xff0c;UC Santa Barbara博士生—宋珍巧的Talk已準時在TechBeat人工智能社區開播&#xff01; 她與大家分享的主題是: “基于人工智能的功能性蛋白質設計”&#xff0c;介紹了如何利用機器學習算…

linux下文件夾上有個鎖或者x 如何去除

發現linux下文件夾上有個鎖或者x 如何去除 原因 權限問題 解決方法 sudo chmod 777 filename 去除當前文件夾以及所有子文件夾 sudo chmod -R 777 filename