日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式——桥模式

發(fā)布時間:2025/3/20 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式——桥模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述

橋模式(Bridge)是為了解決將抽象部分與實現(xiàn)部分分離,好讓他們都在自己的維度上有多維度地變化。這句話是好理解的,只是我在學習完橋模式之后,存在一些疑問,還好現(xiàn)在想通了。現(xiàn)在我就橋模式的設計思想和我的疑問一并發(fā)出,希望于你有益。


版權說明

著作權歸作者所有。
商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處。
本文作者:Coding-Naga
發(fā)表日期: 2016年3月31日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51024127
來源:CSDN
更多內(nèi)容:分類 >> 設計模式


場景

現(xiàn)假設市面上有多種不同型號的電視機,和一些不同的遙控器生產(chǎn)產(chǎn)商。遙控器生產(chǎn)產(chǎn)商要為這些電視機進行生產(chǎn)遙控器,可是這些電視機型號太多,有一些電視機的型號太雜,甚至在后期會出現(xiàn)一些不同型號的電視機。


普通聚合方案

在這個一般方案中,遙控器產(chǎn)商要為每一種電視機生產(chǎn)一種遙控器。類圖如下

每個具體的遙控器都去繼承或是實現(xiàn)遙控器的抽象或是接口,并且在每個具體的遙控器內(nèi)部都聚合了各自的電視機接口。這種方案可以解決問題,可以解決遙控器與電視機的對應關系。可是,卻有一個問題,就像上面場景中所說的,如果這里的有一些新的電視機出現(xiàn),那么生產(chǎn)遙控器的產(chǎn)商還得去生產(chǎn)新的遙控器。這樣一來各自的遙控器數(shù)量不但不好把握,而且這樣的設計很繁雜。


橋模式

上面一般的聚合方案無法解決遙控器的一般性,對于新的機型無法兼容和適應。對于這樣在抽象或是實現(xiàn)上會有多維度擴展的情況,我們就必須重新設計代碼結構了。下面是橋模式,以及橋模式是如何解決這個問題的。

定義

將抽象部分(Abstraction)與實現(xiàn)部分(Implementor)分離,使它們可以獨立地變化。

分析

橋模式的應用場景是某一個抽象或是實現(xiàn)可能存在多維度的變化。就像上面的遙控器實例,我們在遙控器這個抽象上,可能會有不同的生產(chǎn)產(chǎn)商;在電視機這個實現(xiàn)上可能會RCA、Sony等等。橋模式可以讓遙控器的抽象和電視機的實現(xiàn)在各自的方向上多維度變化,而不用關心其他的事情。
在上面我也分析了一般的聚合方案是不可靠的,它的確可以解決一些問題,可是卻是繁瑣的,也是不必要的。
這里再說一個大家可能都比較熟悉的例子。比如我們現(xiàn)在編寫的Java程序,與運行平臺之間的關系。我們可以有很多很多的Java程序,而運行平臺也可以是Windows、Linux或是Mac。我們的Java程序需要在所有的平臺上能夠執(zhí)行,每一個平臺也要保證能夠全部的Java程序。

類圖

這里我們讓遙控器的抽象類聚合電視機的接口。因為所以的電視都實現(xiàn)電視機這個接口,那么遙控器的抽象類也就聚合了所有的電視機實現(xiàn)。這樣不管你電視機的型號如何改變,遙控器都可以不做修改也能繼續(xù)工作。

注:當時我在這里存在一個小疑問,為什么我們的電視機接口不是聚合到遙控器的子類中,而是聚合到遙控器的抽象類中呢?也就是說,這里我有沒有必要有一個遙控器的抽象類?
現(xiàn)在我假設這里不存在這個RemoteControl的抽象類,那么ConcreteRemote將持有TV這個接口,可是這樣在遙控器這個維度上都不好擴展了。橋模式的牛X之處就在于它可以讓多維度的抽象和實現(xiàn)都可以在多維度上進行任意擴展。

邏輯實現(xiàn)

基于上面的類圖,可編寫Java代碼。

TV.java

public interface TV {public void on();public void off();public void tuneChannel(int channel); }

RCA.java

public class RCA implements TV {@Overridepublic void on() {System.out.println("RCA被打開了");}@Overridepublic void off() {System.out.println("RCA被關閉了");}@Overridepublic void tuneChannel(int channel) {System.out.println("切換到第" + channel + "頻道了");} }

Sony.java

public class Sony implements TV {@Overridepublic void on() {System.out.println("Sony被打開了");}@Overridepublic void off() {System.out.println("Sony被打開了");}@Overridepublic void tuneChannel(int channel) {System.out.println("切換到第" + channel + "頻道了");} }

RemoteControl.java

public abstract class RemoteControl {protected TV tv = null;public RemoteControl(TV _tv) {this.tv = _tv;}public abstract void on();public abstract void off();public void setChannel(int channel) {if (tv != null) {tv.tuneChannel(channel);}} }

ConcreteRemote.java

public class ConcreteRemote extends RemoteControl {private int currentStation = 0;private final int MAX_STATION = 25;public ConcreteRemote(TV _tv) {super(_tv);}@Overridepublic void on() {tv.on();}@Overridepublic void off() {tv.off();}public void setChannel(int channel) {currentStation = channel;super.setChannel(currentStation);}public void nextChannel() {currentStation = (MAX_STATION + currentStation + 1) % MAX_STATION;super.setChannel(currentStation);}public void previousChannel() {currentStation = (MAX_STATION + currentStation - 1) % MAX_STATION;super.setChannel(currentStation);} }

模式評價

優(yōu)點缺點
電視機的實現(xiàn)被解耦,它和遙控器之間不再永久綁定相對比較復雜
遙控器和電視機可以獨立擴展,且不會影響對方

Ref

  • 《Head First設計模式》

Github源碼鏈接

https://github.com/qwhai/design-pattern


征集

如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行注冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

總結

以上是生活随笔為你收集整理的Java设计模式——桥模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。