天天看點

橋接模式

問題場景:

現在的手機有很多不同的品牌,樣式也各種各樣,什麼水滴屏,劉海屏,挖孔屏,什麼華為,vivo,小米等等。如果我們基于繼承關系來設計的話,你就會發現這個時候有點無從下手了。

橋接模式

當然這個圖的設計是不合理的,你也可以試着将不同的屏再抽象下,但是發現還是不是很合理,而且即使實作了要擴充的話很是麻煩。這個時候我們就可以引入橋接模式。

橋接模式的主要特點就是把抽象化與行為實作解耦,使得二者可以獨立變化。

在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴充起來不靈活,就像上述場景,手機廠家有多個,手機螢幕也是多元化的。

比如上訴問題,我們這樣來設計

橋接模式

打電話的行為提取一個接口出來,手機提取一個抽象出來,在抽象(Phone)裡面去聚合行為(Brand),這個過程就像搭了個橋把抽象與行為連接配接起來。當然這樣也把抽象和行為分離開來了,可以獨立擴充,如果我要新增一個折疊屏的,隻需要在抽象這邊加一個類就OK,如果需要擴充手機品牌,隻需要在接口實作那邊加個小米就可以了,二者可以獨立變化,提高系統的靈活性。

行為側:

接口:

package

com.nijunyang.designpatterns.bridge.api;

/**

* @author: create by nijunyang

* @date:2019/9/22

*/

public

interface

Brand {

void

call();

void

close();

}

 接口實作:

package

com.nijunyang.designpatterns.bridge.impl;

import

com.nijunyang.designpatterns.bridge.api.Brand;

/**

* @author: create by nijunyang

* @date:2019/9/22

*/

public

class

HuaWei

implements

Brand {

@Override

public

void

call() {

System.out.println(

"華為手機打電話"

);

}

@Override

public

void

close() {

System.out.println(

"華為手機關機"

);

}

}

 抽象:

抽象類:

package

com.nijunyang.designpatterns.bridge.phone;

import

com.nijunyang.designpatterns.bridge.api.Brand;

/**

* @author: create by nijunyang

* @date:2019/9/22

*/

public

abstract

class

Phone {

private

Brand brand;

public

Phone(Brand brand) {

this

.brand = brand;

}

public

void

call() {

brand.call();

}

public

void

close() {

brand.close();

}

}

 子類:

package

com.nijunyang.designpatterns.bridge.phone;

import

com.nijunyang.designpatterns.bridge.api.Brand;

/**

* @author: create by nijunyang

* @date:2019/9/22

*/

public

class

WaterDropScreePhone

extends

Phone {

public

WaterDropScreePhone(Brand brand) {

super

(brand);

}

@Override

public

void

call() {

System.out.print(

"這是水滴屏"

);

super

.call();

}

@Override

public

void

close() {

System.out.print(

"這是水滴屏"

);

super

.close();

}

}

 測試:

package

com.nijunyang.designpatterns.bridge;

import

com.nijunyang.designpatterns.bridge.impl.HuaWei;

import

com.nijunyang.designpatterns.bridge.phone.Phone;

import

com.nijunyang.designpatterns.bridge.phone.WaterDropScreePhone;

/**

* @author: create by nijunyang

* @date:2019/9/22

*/

public

class

Test {

public

static

void

main(String[] args)

{

Phone phone =

new

WaterDropScreePhone(

new

HuaWei());

phone.call();

}

}

橋接模式

使用橋接模式需要找到合适的抽象與行為進行分離,它可以替代使用繼承出現的多層繼承或者接口的多實作情況,降低系統的管理和維護成本。但是會增加系統的了解和設計難度。

JDBC驅動就是一個橋接模式的應用,通過DriverManager去聚合Connection實作搭橋,DriverManager通過配置去看是mysql或者是oracle等。各種武功變化萬千,為武功心法不變,橋接模式中,抽象不一定非得是抽象類,行為也不一定非要抽取一個接口出來,就像JDBC這個,心法是一樣,打出來的招式卻有些變化。還有銀行轉賬也是一個場景,不同使用者可以通過不同方式轉賬。使用者:普通使用者,黃金使用者,白金使用者...,轉賬方式:網銀轉賬 ,櫃台轉賬,ATM轉賬,第三方支付轉賬...

轉載自:https://www.cnblogs.com/nijunyang/p/11565760.html