寫在前面
推薦閱讀:
Java描述設(shè)計(jì)模式(07):適配器模式
Java描述設(shè)計(jì)模式(06):建造者模式
Java描述設(shè)計(jì)模式(05):原型模式
源碼地址:
點(diǎn)這里,開篇就是了。
一、橋接模式簡介
1、基礎(chǔ)描述
橋梁模式是對(duì)象的結(jié)構(gòu)模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。橋梁模式的用意是“將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化”。
2、場(chǎng)景問題描述
1)、場(chǎng)景分析
在一個(gè)復(fù)雜的系統(tǒng)中,消息通知是一個(gè)必備模塊,一般封裝方式主要從下面兩個(gè)方式入手:
- 消息類型
用戶端消息(user-client)
管理端消息(system-client)
- 消息接收
郵件發(fā)送(email)
短信發(fā)送(msg)
2)、場(chǎng)景圖解
3)、源碼實(shí)現(xiàn)
/**
* 橋接模式場(chǎng)景應(yīng)用
*/
public class C01_InScene {
public static void main(String[] args) {
// 創(chuàng)建具體的實(shí)現(xiàn)對(duì)象
MsgImplementor implementor = new SendBySMS() ;
// 創(chuàng)建普通的消息對(duì)象
AbstractMsg abstractMessage = new UserMsg(implementor);
abstractMessage.sendMessage('您的賬戶異地登陸', '用戶A0001');
// 切換為郵件方式且加急處理
implementor = new SendByEmail() ;
abstractMessage = new AdminMsg(implementor);
abstractMessage.sendMessage('項(xiàng)目上線通知', '運(yùn)維S0001');
}
}
/**
* 封裝消息類型
*/
abstract class AbstractMsg {
// 持有一個(gè)實(shí)現(xiàn)部分的對(duì)象
MsgImplementor impl ;
public AbstractMsg (MsgImplementor impl){
this.impl = impl ;
}
/**
* 發(fā)送消息,委派給實(shí)現(xiàn)部分的方法
* @param message 要發(fā)送消息的內(nèi)容
* @param toUser 消息的接受者
*/
public void sendMessage (String message, String toUser){
this.impl.send(message, toUser);
}
}
class AdminMsg extends AbstractMsg{
public AdminMsg(MsgImplementor impl) {
super(impl);
}
@Override
public void sendMessage(String message, String toUser) {
message = '辛苦的管理員:' message;
super.sendMessage(message, toUser);
}
}
class UserMsg extends AbstractMsg{
public UserMsg(MsgImplementor impl) {
super(impl);
}
@Override
public void sendMessage(String message, String toUser) {
message = '尊敬的用戶:' message ;
super.sendMessage(message, toUser);
}
}
/**
* 封裝消息發(fā)送
*/
interface MsgImplementor {
void send (String message , String toUser) ;
}
class SendBySMS implements MsgImplementor{
@Override
public void send(String message, String toUser) {
System.out.println('短信通知:' toUser ';內(nèi)容:' message);
}
}
class SendByEmail implements MsgImplementor{
@Override
public void send(String message, String toUser) {
System.out.println('郵件通知:' toUser ';內(nèi)容:' message);
}
}
二、橋接模式
1、模式圖解
2、核心角色
1、抽象化(Abstraction)角色
抽象化給出的定義,并保存一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。
2、修正抽象化(RefinedAbstraction)角色
擴(kuò)展抽象化角色,改變修正父類對(duì)抽象化的定義。
3、實(shí)現(xiàn)化(Implementor)角色
這個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不給出具體的實(shí)現(xiàn)。
4、具體實(shí)現(xiàn)化(ConcreteImplementor)角色
這個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。
3、源碼封裝
abstract class Abstraction {
private Implementor implementor ;
public Abstraction (Implementor implementor){
this.implementor = implementor ;
}
// 實(shí)例方法
public void operation (){
implementor.operationImpl();
}
}
class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
//其他的操作方法
public void otherOperation(){
}
}
abstract class Implementor {
// 示例方法,實(shí)現(xiàn)抽象部分需要的某些具體功能
public abstract void operationImpl () ;
}
class ConcreteImplementorA extends Implementor{
@Override
public void operationImpl() {
System.out.println('ConcreteImplementorA.operationImpl()');
}
}
class ConcreteImplementorB extends Implementor{
@Override
public void operationImpl() {
System.out.println('ConcreteImplementorB.operationImpl()');
}
}
三、Java應(yīng)用場(chǎng)景
橋梁模式在Java應(yīng)用中的一個(gè)非常典型的例子就是JDBC驅(qū)動(dòng)器。抽象API可以對(duì)各種數(shù)據(jù)庫引擎發(fā)出SQL指令,并不直接與數(shù)據(jù)庫引擎互動(dòng),JDBC驅(qū)動(dòng)器負(fù)責(zé)這個(gè)底層的工作。
JDBC的這種架構(gòu),把抽象部分和具體部分分離開來,從而使得抽象部分和具體部分都可以獨(dú)立地?cái)U(kuò)展。