桥接模式bridge
在学习桥接模式之前我们先来回顾以下以前的知识
开闭原则(OCP)
对扩展开放。模块对扩展开放,就意味着需求变化时,可以对模块扩展,使其具有满足那些改变的新行为。换句话说,模块通过扩展的方式去应对需求的变化。
对修改关闭。模块对修改关闭,表示当需求变化时,关闭对模块源代码的修改,当然这里的“关闭”应该是尽可能不修改的意思,也就是说,应该尽量在不修改源代码的基础上面扩展组件。
组合聚合复用原则(CARP)
尽量使用对象组合,而不是继承来达到复用的目的。就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。简而言之,要尽量使用合成/聚合,尽量不要使用继承。
脱耦
抽象化和实现化之间使用组合聚合关系而不是继承关系
什么是桥接模式?
桥接模式是一种结构型设计模式。Bridge模式基于类的最小设计原则,通过使用封装、聚合、以及继承等行为让不同的类承担不同的职责。主要特点是把抽象与行为实现分开来,从而保持各部分的独立性以及对应他们的功能扩展。
Uml图以及角色分析
抽象化等级结构与实现化等级结构
单向桥:只能是抽象化部分的对象去使用具体实现部分的对象。
抽象类(Abstraction)
抽象类接口(接口这货抽象类)维护队行为实现(implementation)的引用。它的角色就是桥接类。
Implementor
行为实现类接口(Abstraction接口定义了基于Implementor接口的更高层次的操作)
基本代码:
使用邮件、手机、站内等多种方式实现发送普通消息、加急消息、特级消息。
public interface MessageImplementor{ //实现接口
public void send(String message,String toUser);
}
public abstract class AbsteactMessage{
proctected MessageImplementor impl; //单向桥抽象部分使用实现部分
public AbsteactMessage(MessageImplementor impl){
impl=this.impl;
}
//发送消息,转调实现部分的方法
public void senfMessage(String message,String toUser){
this.impl.send(message,toUser);
}
}
//具体实现站内发送方式
public class MessageSMS implements MessageImplementor{
public void send(String message, String toUser) {
System.out.println("使用站内短消息的方式,发送消息'"
+message+"'给"+toUser);
}
}
//邮件发送
public class MessageEmail implements MessageImplementor{
public void send(String message, String toUser) {
System.out.println("使用Email的方式,发送消息'"
+message+"'给"+toUser);
}
}
//手机发送
public class MessageMobile implements MessageImplementor{
public void send(String message, String toUser) {
System.out.println("使用手机短消息的方式,发送消息'"
+message+"'给"+toUser);
}
}
//抽象普通消息
public class CommonMessage extends AbstractMessage{
public CommonMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message, String toUser) {
super.sendMessage(message, toUser);
}
}
//抽象加急消息
public class UrgencyMessage extends AbstractMessage{
public UrgencyMessage(MessageImplementor impl) {
super(impl);
}
public void sendMessage(String message, String toUser) {
message = "加急:"+message;
super.sendMessage(message, toUser);
}
public Object watch(String messageId) { //监控方法
return null;
}
}
本质:分离抽象和实现
应用场景:
不希望在抽象和实现部分采用固定的绑定关系;抽象和实现部分都应该可以扩展的情况;
许多子类继承的情况;
优点:分离抽象部分和实现部分,使彼此相互独立,变化不会相互影响