本篇文章為大家帶來了關於java的相關知識,其中主要介紹了橋接模式的相關問題,橋接模式將抽象與實現分離,使它們可以獨立變化,降低了抽象和實現這兩個可變維度的耦合度,下面一起來看一下,希望對大家有幫助。
推薦學習:《java影片教學》
其實在現實生活中,有很多類別可以有兩個或更多個維度的變化,如圖形既可按形狀分,又可按顏色分,如果用繼承方式,m 種形狀和n 種顏色的圖形就有m*n 種,不但對應的子類很多,而且擴展比較困難。
例如不同顏色和字體的文字、不同品牌和功率的汽車、不同性別和職業的男女、支援不同平台和不同檔案格式的媒體播放器等。如果用橋接模式就能很好地解決這些問題。
1、橋接模式的定義
將抽象與實作分離,使它們可以獨立變更。它是用組合關係代替繼承關係來實現,從而降低了抽象化和實現這兩個可變維度的耦合度
模式類型:結構設計模式
原理類別圖:
原理類別圖表說明:
- #Client類別: 橋接模式的呼叫者
- 抽象類別(Abstraction) : 維護了Implementor/即它的實作類別ConcretelmplementorA…二者是器合關係,Abstraction充當橋接英
- #RehinedAbstraction: 是Abstraction抽象類別的子類別lmplementor:行為實作類別的介面
- ConcretelmplementorA/B: 行為的具體實作類別
- #從UML圖: 這裡的抽象類別和介面是聚合的關係,其實呼叫和被呼叫關係
2、橋接模式的優缺點
優點:
- 抽象與實作分離,擴展能力強
- #符合開閉原則
- #符合合成復用原則
- 其實作細節對客戶透明
缺點:
- 由於聚合關係建立在抽象層,要求開發者針對抽象化進行設計與編程,能正確辨識系統中兩個獨立變化的維度,這增加了系統的理解與設計難度
##3、橋接模式的結構橋接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色: 定義抽象類,並包含一個對實作化物件的引用
- 擴展抽象化(Refined Abstraction)角色:是抽象角色的子類,實作父類別中的業務方法,並透過組合關係呼叫來實現角色中的業務方法 實現化(Implementor)角色:定義實現化角色的接口,供擴展抽象化角色調用
- 具體實現化(Concrete Implementor)角色:給出實現化角色接口的具體實現
結構圖:
#該結構圖的實作程式碼:
實視化角色:
/** * 实视化角色 */public interface Implemntor { public void OperationImpl();}
具體實作角色:
/** * 具体实现化角色 */public class ConcreteImplementorA implements Implemntor{ @Override public void OperationImpl() { System.out.println("具体实现化角色被访问"); }}
抽象角色:##/**
* 抽象化角色
*/public abstract class Abstraction {
protected Implemntor implemntor;
protected Abstraction(Implemntor implemntor){
this.implemntor = implemntor;
}
public abstract void Operation();}
/**
* 扩展抽象化角色
*/public class RefinedAbstraction extends Abstraction{
protected RefinedAbstraction(Implemntor implemntor) {
super(implemntor);
}
public void Operation(){
System.out.println("扩展抽象化角色被访问");
implemntor.OperationImpl();
}}
public class Test {
public static void main(String[] args) {
Implemntor implemntor = new ConcreteImplementorA();
Abstraction abs = new RefinedAbstraction(implemntor);
abs.Operation();
}}
扩展抽象化角色被访问
具体实现化角色被访问
將實作與抽象放在兩個不同的類別層次中,使兩個層次可以獨立改變
交通工具在路上行駛,這裡有兩個維度的變化,
交通工具的類型不同,路也分水泥路和柏油路
類圖:/**
* 交通工具类
*/public interface Vehicle {
public void drive();}
# /**
* 具体的交通工具:小汽车
*/public class Car implements Vehicle{
@Override
public void drive() {
System.out.println("小汽车");
}}
/**
* 具体的交通工具:大巴车
*/public class Bus implements Vehicle{
@Override
public void drive() {
System.out.println("大巴车");
}}
/**
* 抽象的路
*/public abstract class Road {
protected Vehicle vehicle;
public Road(Vehicle vehicle){
this.vehicle = vehicle;
}
public abstract void driveOnRoad();}
/**
* 具体的路:油柏路
*/public class UnpavedRoad extends Road{
public UnpavedRoad(Vehicle vehicle) {
super(vehicle);
}
@Override
public void driveOnRoad() {
super.vehicle.drive();
System.out.println("行驶在油柏路");
}}
/**
* 具体的路:水泥路
*/public class CementRoad extends Road{
public CementRoad(Vehicle vehicle) {
super(vehicle);
}
@Override
public void driveOnRoad() {
super.vehicle.drive();
System.out.println("行驶在水泥路");
}}
//测试public class Test {
public static void main(String[] args) {
Road roadCar = new CementRoad(new Car());
roadCar.driveOnRoad();
Road roadBus = new CementRoad(new Bus());
roadBus.driveOnRoad();
}}
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用. 推荐学习:《java视频教程》小汽车
行驶在水泥路
大巴车
行驶在水泥路
5、桥接模式的注意事项
6、桥接模式应用场景
以上是詳細介紹Java橋接模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器