动机
- 由于某些类型的固有的实现逻辑,使得他们具有两个变化的维度,乃至多个维度的变化。
- 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?
模式定义
将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。
类图
总结
核心就是实现了用户需要的接口(维度一),同时组合了其他维度(其他维度)变化的接口实例。
继承/实现 可以很好的约束接口规范,组合可以灵活的使用其他对象的功能,十分方便。
其实设计模式的核心主要就是,继承、实现、组合、延迟实现、封装技术的使用。
- Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”它们。
- Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
- Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。
实例
场景:一个Message系统,系统中有一些公共方法,分别由PC和Mobile两个产品,同时每个产品又有精简版和完美版。
没有使用桥模式之前
没有稳定的framework供用户调用,代码没有做到开闭原则;同时代码重复率过高,不符合组合复用原则。
- 定义消息抽象类
public abstract class Message {
public abstract void login();
public abstract void sendMsg();
public abstract void sendPic();
public abstract void playSound();
public abstract void writeText();
public abstract void connect();
}
- 定义两个产品的基类
public abstract class PCMessageBase extends Message {
public void playSound() {
System.out.println("PC message base play sound");
}
public void writeText() {
System.out.println("PC message base write text");
}
public void connect() {
System.out.println("PC message base connect");
}
}
public abstract class MobileMessageBase extends Message {
public void playSound() {
System.out.println("Mobile message base play sound");
}
public void writeText() {
System.out.println("Mobile message base write text");
}
public void connect() {
System.out.println("Mobile message base connect");
}
}
- 定义产品的业务类
public class PCMessageLite extends PCMessageBase {
@Override
public void login() {
System.out.println("PC message login");
super.connect();
}
@Override
public void sendMsg() {
System.out.println("PC message send msg");
super.writeText();
}
@Override
public void sendPic() {
System.out.println("PC message send pic");
super.writeText();
}
}
public class PCMessagePefect extends PCMessageBase {
@Override
public void login() {
System.out.println("PC message login");
super.playSound();
super.connect();
}
@Override
public void sendMsg() {
System.out.println("PC message send msg");
super.playSound();
super.writeText();
}
@Override
public void sendPic() {
System.out.println("PC message send pic");
super.playSound();
super.writeText();
}
}
// 手机消息业务类
public class MobileMessageLite extends MobileMessageBase {
@Override
public void login() {
System.out.println("Mobile message login");
super.connect();
}
@Override
public void sendMsg() {
System.out.println("Mobile message send msg");
super.writeText();
}
@Override
public void sendPic() {
System.out.println("Mobile message send pic");
super.writeText();
}
}
public class MobileMessagePefect extends MobileMessageBase {
@Override
public void login() {
System.out.println("Mobile message login");
super.playSound();
super.connect();
}
@Override
public void sendMsg() {
System.out.println("Mobile message send msg");
super.playSound();
super.writeText();
}
@Override
public void sendPic() {
System.out.println("Mobile message send pic");
super.playSound();
super.writeText();
}
}
- 定义用户使用框架类
public class MessageUser {
// 静态绑定,不符合开闭原则。
public void message() {
MobileMessagePefect mobileMessagePefect = new MobileMessagePefect();
mobileMessagePefect.sendMsg();
}
public static void main(String[] args) {
MessageUser user = new MessageUser();
user.message();
}
}
使用桥模式之后
- 分拆Messge接口为两个类,因为是两个变化维度,使类的职责单一化
public interface MessageBase {
void login();
void sendMsg();
void sendPic();
}
public interface MessageImp {
void playSound();
void writeText();
void connect();
}
- 实现不同的产品
public class MobileMessageImp implements MessageImp {
@Override
public void playSound() {
System.out.println("Mobile Message playSound");
}
@Override
public void writeText() {
System.out.println("Mobile Message writeText");
}
@Override
public void connect() {
System.out.println("Mobile Message connect");
}
}
public class PCMessageImp implements MessageImp {
@Override
public void playSound() {
System.out.println("PC Message playSound");
}
@Override
public void writeText() {
System.out.println("PC Message writeText");
}
@Override
public void connect() {
System.out.println("PC Message connect");
}
}
- 组合不同产品的实现,完善不同业务产品的功能
public abstract class MessageBridge implements MessageBase {
protected MessageImp messageImp;
}
public class MessageLite extends MessageBridge {
private MessageImp messageImp;
public MessageLite(MessageImp messageImp) {
this.messageImp = messageImp;
}
@Override
public void login() {
System.out.println("Mobile message login");
messageImp.connect();
}
@Override
public void sendMsg() {
System.out.println("Mobile message send msg");
messageImp.writeText();
}
@Override
public void sendPic() {
System.out.println("Mobile message send pic");
messageImp.writeText();
}
}
public class MessagePerfect extends MessageBridge {
public MessagePerfect(MessageImp messageImp) {
super.messageImp = messageImp;
}
@Override
public void login() {
System.out.println("Mobile message login");
messageImp.playSound();
messageImp.connect();
}
@Override
public void sendMsg() {
System.out.println("Mobile message send msg");
messageImp.playSound();
messageImp.writeText();
}
@Override
public void sendPic() {
System.out.println("Mobile message send pic");
messageImp.playSound();
messageImp.writeText();
}
}
- 稳定用户框架的调用
public class MessageUser {
// 运行时绑定
public void message(MessagePerfect perfect) {
perfect.sendMsg();
}
public static void main(String[] args) {
MessageUser user = new MessageUser();
MessageImp messageImp = new MobileMessageImp();
user.message(new MessagePerfect(messageImp));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100412.html