寫在前面
橋接模式:將抽象與實現分離,使它們可以獨立變化。它是用組合/聚合關係代替繼承關係來實現,從而降低了抽象和實現這兩個可變維度的耦合度。
使用場景1:要繪製矩形、圓形、橢圓、正方形,繪製的圖形需要具有不同的顏色,如紅色、綠色、藍色等,我們可以設計顏色和形狀兩個變化維度:
我們設計一個抽象化角色"顏色",然後讓紅色、綠色、藍色統一繼承自"顏色",讓矩形、圓形、橢圓、正方形統一繼承自一個介面"形狀"。"顏色"的構造方法中傳入"形狀"這個介面,這樣"顏色"和"形狀"就橋接起來了
使用場景2:手機、電腦、電視都需要接收訊息,訊息又分為緊急訊息、普通訊息,這時候我們就可以把"系統"和"訊息"抽象出來橋接。如下有具體實現程式碼
1、橋接模式例項
以不同的系統需要接收不同的訊息為例
1.1、訊息類
抽象訊息類
public abstract class AbstractMessage {
//持有一個實現部分的物件
MessageImplementor impl;
public AbstractMessage(MessageImplementor impl){
this.impl = impl;
}
/**
* 傳送訊息,委派給實現部分的方法
* @param message 要傳送訊息的內容
* @param toUser 訊息的接受者
*/
public void sendMessage(String message , String toUser){
this.impl.send(message, toUser);
}
}
普通訊息
public class CommonMessage extends AbstractMessage {
public CommonMessage(MessageImplementor impl) {
super(impl);
}
@Override
public void sendMessage(String message, String toUser) {
// 對於普通訊息,直接呼叫父類方法,傳送訊息即可
super.sendMessage(message, toUser);
}
}
緊急訊息
public class UrgencyMessage extends AbstractMessage {
public UrgencyMessage(MessageImplementor impl) {
super(impl);
}
@Override
public void sendMessage(String message, String toUser) {
message = "加急:" + message;
super.sendMessage(message, toUser);
}
/**
* 擴充套件自己的新功能,監控某訊息的處理狀態
* @param messageId 被監控的訊息編號
* @return 監控到的訊息的處理狀態
*/
public Object watch(String messageId) {
// 根據訊息id獲取訊息的狀態,組織成監控的資料物件,然後返回
return null;
}
}
1.2、系統類
系統介面
public interface MessageImplementor {
/**
* 傳送訊息
* @param message 要傳送訊息的內容
* @param toUser 訊息的接受者
*/
public void send(String message , String toUser);
}
手機
public class Phone implements MessageImplementor {
@Override
public void send(String message, String toUser) {
System.out.println("使用系統內短訊息的方法,傳送訊息'"+message+"'給"+toUser);
}
}
電腦
public class Pc implements MessageImplementor {
@Override
public void send(String message, String toUser) {
System.out.println("使用郵件短訊息的方法,傳送訊息'"+message+"'給"+toUser);
}
}
1.3、使用
public class Client {
public static void main(String[] args) {
// 手機傳送
MessageImplementor impl = new Phone();
AbstractMessage message = new CommonMessage(impl);
message.sendMessage("加班申請速批--來自手機","李總");
// 電腦傳送
impl = new Pc();
message = new UrgencyMessage(impl);
message.sendMessage("加班申請速批---來自電腦","李總");
}
}
2、JDBC
在java中jdbc是使用橋接模式實現的
2.1、jdbc連線例項
import java.sql.*;
public class JdbcTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException{
// 需要匯入mysql-connector-java-8.0.27.jar,資料庫test、使用者名稱root,密碼root
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","root");
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
System.out.println("id :"+rs.getInt("id")+",name :"+rs.getInt("id"));
}
rs.close();
ps.close();
}
}