桥接模式
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
优点
- 抽象和实现的分离。
- 优秀的扩展能力。
- 实现细节对客户透明。
缺点
- 增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
- 要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
适用场景
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
博文推荐
案例描述
以一个消息管理为例,消息类别可分延时消息、即时消息;消息发送方式可分微信发送、QQ发送、邮件发送。
UML类图关系如下
具体代码实现如下
Way(发送方式)
package com.lcq.bridgepattern;
/**
* 发送消息的方式
*/
public interface Way {
//发送方式
String name();
}
WeChatWay(微信发送)
package com.lcq.bridgepattern;
/**
* 微信发送消息
*/
public class WeChatWay implements Way{
public String name() {
return "微信";
}
}
QQWay(QQ发送)
package com.lcq.bridgepattern;
/**
* QQ发送消息
*/
public class QQWay implements Way{
public String name() {
return "qq";
}
}
EmailWay(邮件发送)
package com.lcq.bridgepattern;
/**
* 邮件发送消息
*/
public class EmailWay implements Way{
public String name() {
return "email";
}
}
Message(消息)
package com.lcq.bridgepattern;
public abstract class Message {
protected Way way;
public Message(Way way){
this.way = way;
}
//发送消息
abstract String send();
}
ImmediateMessage(即时消息)
package com.lcq.bridgepattern;
/**
* 即时消息
*/
public class ImmediateMessage extends Message{
private final String type="即时";//即时消息类型
public ImmediateMessage(Way way) {
super(way);
}
String send() {
return way.name()+"-"+type;
}
}
TimeDelayMessage(延时消息)
package com.lcq.bridgepattern;
/**
* 延时消息
*/
public class TimeDelayMessage extends Message{
private final String type="延时";
public TimeDelayMessage(Way way) {
super(way);
}
String send() {
return way.name()+"-"+type;
}
}
测试
package com.lcq.bridgepattern;
public class Test {
public static void main(String[] args) {
//即时消息
Message message1 = new ImmediateMessage(new WeChatWay());
Message message2 = new ImmediateMessage(new QQWay());
Message message3 = new ImmediateMessage(new EmailWay());
//延时消息
Message message4 = new TimeDelayMessage(new WeChatWay());
Message message5 = new TimeDelayMessage(new QQWay());
Message message6 = new TimeDelayMessage(new EmailWay());
//发送消息
System.out.println(message1.send());
System.out.println(message2.send());
System.out.println(message3.send());
System.out.println("----------------------------------");
System.out.println(message4.send());
System.out.println(message5.send());
System.out.println(message6.send());
}
}
运行结果
小结:当一个类存在两个独立变化的维度,(这里就从消息层面出发,分为消息类型和消息发送方式两个维度)且这两个维度都需要进行扩展(消息类型和消息发送方式可变);对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。