????我們知道Java里共有23種設(shè)計(jì)模式痛侍,可通過組合的方式建立兩個(gè)類之間的聯(lián)系而不是繼承,橋接模式屬于結(jié)構(gòu)型設(shè)計(jì)模式缸逃。
橋接模式
定義
橋接模式也稱為橋梁模式壶运、接口模式耐齐,是將抽象的部分與它的具體實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化蒋情。
適用場(chǎng)景
(1) 在抽象和具體實(shí)現(xiàn)之間需要增加更多的靈活性的場(chǎng)景埠况。
(2) 一個(gè)類存在兩個(gè)(或多個(gè))獨(dú)立變化的維度,而這兩個(gè)維度都需要獨(dú)立進(jìn)行擴(kuò)展棵癣。
(3) 不希望使用繼承辕翰,或因?yàn)槎鄬永^承導(dǎo)致系統(tǒng)類的數(shù)量增加。
優(yōu)點(diǎn)
(1) 分離抽象部分和具體實(shí)現(xiàn)部分狈谊。
(2) 提高系統(tǒng)的擴(kuò)展性喜命。
(3) 符合開閉原則。
(4) 符合合成復(fù)用原則的畴。
缺點(diǎn)
(1) 增加了系統(tǒng)理解和設(shè)計(jì)難度渊抄。
(2) 需要正確地識(shí)別系統(tǒng)中兩個(gè)獨(dú)立變化的緯度。
實(shí)例
/**
* 消息統(tǒng)一發(fā)送接口 更多消息類型實(shí)現(xiàn)
*/
public interface IMessage {
void sendMessage(String message, String toUser);
}
/**
* 郵件消息實(shí)現(xiàn)類
*/
public class EmailMessage implements IMessage {
@Override
public void sendMessage(String message, String toUser) {
System.out.println(String.format("使用郵件發(fā)送消息,發(fā)送內(nèi)容:%s 給 %s", message, toUser));
}
}
/**
* 短信消息實(shí)現(xiàn)類
*/
public class SmsMessage implements IMessage {
@Override
public void sendMessage(String message, String toUser) {
System.out.println(String.format("使用短信發(fā)送消息,發(fā)送內(nèi)容:%s 給 %s", message, toUser));
}
}
/**
* 抽象橋接角色類 緊急程度繼承
* 橋接了消息類型與消息的緊急程度
*/
public abstract class AbstractMessage {
IMessage message;
public AbstractMessage(IMessage message) {
this.message = message;
}
public void sendMessage(String message, String toUser) {
this.message.sendMessage(message, toUser);
}
}
/**
* 普通消息類
*/
public class NormalMessage extends AbstractMessage {
public NormalMessage(IMessage message) {
super(message);
}
@Override
public void sendMessage(String message, String toUser) {
super.message.sendMessage(message, toUser);
}
}
/**
* 緊急消息類
*/
public class UrgencyMessage extends AbstractMessage {
public UrgencyMessage(IMessage message) {
super(message);
}
@Override
public void sendMessage(String message, String toUser) {
message = "[加急]" + message;
super.message.sendMessage(message, toUser);
}
/**
* 擴(kuò)展功能,監(jiān)控消息狀態(tài)
*/
public Object watch(String messageId) {
return null;
}
}
/**
* 測(cè)試類
*/
public class Test {
public static void main(String[] args) {
IMessage message = new EmailMessage();
AbstractMessage abstractMessage = new NormalMessage(message);
abstractMessage.sendMessage("加班申請(qǐng)", "Tom");
message = new SmsMessage();
abstractMessage = new UrgencyMessage(message);
abstractMessage.sendMessage("加班申請(qǐng)", "Tom");
}
}