结构型模式有七种:
桥接模式
将抽象部分与实现部分分离,使它们都可以独立的变化。
实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间耦合
角色
桥接(Bridge)模式包含以下主要角色。
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
优缺点
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
类图
代码
根据不同的告警规则,触发不同类型的告警
interface MsgSender{
void send(String message);
}
public class TelephoneMsgSender implements MsgSender {
private List<String> telephones;
public TelephoneMsgSender(List<String> telephones) {
this.telephones = telephones;
}
@Override
public void send(String message) {
telephones.forEach(s->{
System.out.println("向"+s+"发送"+message);
});
}
}
public class EmailMsgSender implements MsgSender {
private List<String> emails;
public EmailMsgSender(List<String> emails) {
this.emails = emails;
}
@Override
public void send(String message) {
emails.forEach(s->{
System.out.println("向"+s+"发送"+message);
});
}
}
public static abstract class Notification {
protected MsgSender msgSender;
public Notification(MsgSender msgSender) {
this.msgSender = msgSender;
}
public abstract void notify(String message);
}
public class SevereNotification extends Notification {
public SevereNotification(MsgSender msgSender) {
super(msgSender);
}
@Override
public void notify(String message) {
msgSender.send(message);
}
}
public class UrgencyNotification extends Notification {
public UrgencyNotification(MsgSender msgSender) {
super(msgSender);
}
@Override
public void notify(String message) {
msgSender.send(message);
}
}
public static void main(String[] args) {
List<String> telephones = new ArrayList<>();
telephones.add("110");
telephones.add("112");
MsgSender msgSender = new TelephoneMsgSender(telephones);
SevereNotification severeNotification = new SevereNotification(msgSender);
severeNotification.notify("火警");
}
一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展