抽象和實現分離,靈活易擴展的橋接模式
01 定義
橋梁模式是對象的結構模式。又稱為柄體(Handle and Body)模式或接口(Interface)模式。橋梁模式的用意是“將抽象化(Abstraction)與實現化(Implementation)脫耦,使得二者可以獨立地變化”。
02 案例
需求
通過企業微信和qq的方式給員工發送消息
方案一
定義發送消息的接口
/**
* 發送消息的接口
* @author:liyajie
* @createTime:2022/2/21 10:33
* @version:1.0
*/
public interface AbstractSendMsgService {
// 發送消息
public void sendMsg();
}
定義普通消息接口
/**
* 普通消息接口
* @author:liyajie
* @createTime:2022/2/21 11:32
* @version:1.0
*/
public interface CommonMsg extends AbstractSendMsgService{
}
定義微信消息實現類
/**
* 發送消息的實現接口
* @author:liyajie
* @createTime:2022/2/21 10:35
* @version:1.0
*/
public class WxMsgServiceImpl implements CommonMsg{
@Override
public void sendMsg() {
System.out.println("老板使用微信給你發了消息,快去接收吧");
}
}
定義QQ消息實現類
/**
* 發送消息的實現接口
* @author:liyajie
* @createTime:2022/2/21 10:35
* @version:1.0
*/
public class QqMsgServiceImpl implements CommonMsg{
@Override
public void sendMsg() {
System.out.println("老板使用QQ給你發了消息,快去接收吧");
}
}
定義測試類
/**
* 測試類
* @author:liyajie
* @createTime:2022/2/21 10:37
* @version:1.0
*/
public class Test {
public static void main(String[] args) {
new WxMsgServiceImpl().sendMsg();
new QqMsgServiceImpl().sendMsg();
}
}
測試結果
方案二
定義發送消息抽象接口
/**
* 發送消息的抽象接口
* @author:liyajie
* @createTime:2022/2/21 10:33
* @version:1.0
*/
public abstract class NewAbstractSendMsgService {
protected SendMsgImplementor sendMsgImplementor;
public NewAbstractSendMsgService(SendMsgImplementor sendMsgImplementor){
this.sendMsgImplementor = sendMsgImplementor;
}
// 微信
public void sendMsg(){
this.sendMsgImplementor.sendMsg();
}
}
定義發送消息實現類
/**
* 發送消息的實現接口
* @author:liyajie
* @createTime:2022/2/21 10:35
* @version:1.0
*/
public class NewSendMsgServiceImpl extends NewAbstractSendMsgService{
public NewSendMsgServiceImpl(SendMsgImplementor sendMsgImplementor) {
super(sendMsgImplementor);
}
@Override
public void sendMsg() {
super.sendMsg();
}
}
定義發送消息統一接口
/**
* 發送消息統一接口
* @author:liyajie
* @createTime:2022/2/21 10:41
* @version:1.0
*/
public interface SendMsgImplementor {
void sendMsg();
}
定義微信發送消息實現類
/**
* 微信發送消息
* @author:liyajie
* @createTime:2022/2/21 10:45
* @version:1.0
*/
public class WxImplementor implements SendMsgImplementor{
@Override
public void sendMsg() {
System.out.println("老板使用微信給你發了消息,快去接收吧");
}
}
定義QQ發送消息實現類
/**
* QQ發送消息
* @author:liyajie
* @createTime:2022/2/21 10:45
* @version:1.0
*/
public class QqImplementor implements SendMsgImplementor{
@Override
public void sendMsg() {
System.out.println("老板使用QQ給你發了消息,快去接收吧");
}
}
定義測試類
/**
* 測試類
* @author:liyajie
* @createTime:2022/2/21 10:37
* @version:1.0
*/
public class TestNew {
public static void main(String[] args) {
NewSendMsgServiceImpl newSendMsgService = new NewSendMsgServiceImpl(new QqImplementor());
newSendMsgService.sendMsg();
NewSendMsgServiceImpl newSendMsgService2 = new NewSendMsgServiceImpl(new WxImplementor());
newSendMsgService2.sendMsg();
}
}
測試結果
03 對比分析
- 方案一,即一般實現方式,微信和QQ兩種發送消息的方式需要同時去實現CommonMsg和AbstractSendMsgService兩個接口中的方法,耦合性較高;另外比如新增緊急消息的發送或者新增短信的方式發送消息的需求,改動較多,擴展性較差。
- 方案二,為橋接模式實現方式,在消息類的構造方法中傳入接口SendMsgImplementor,從而使發送消息的抽象和具體實現進行了分離,實現了解耦;后期新增緊急消息的發送或者新增短信的方式發送消息的需求,也只需要新增緊急消息類和短信發送類即可,和QQ,微信等發送消息互不影響,擴展方便,符合開閉原則,復用原則。
04 總結
橋梁模式分離了抽象部分和實現部分,從而極大地提供了系統的靈活性。讓抽象部分和實現部分獨立出來,分別定義接口,這有助于對系統進行分層,從而產生更好的結構化的系統。
橋梁模式使得抽象部分和實現部分可以分別獨立地擴展,而不會相互影響,從而大大提高了系統的可擴展性。
本文轉載自微信公眾號「溫故知新之java」,可以通過以下二維碼關注。轉載本文請聯系溫故知新之java公眾號。