桥梁模式
桥梁模式属于对象的结构型模式,主要是为了将的抽象部分和实现部分分离开来,从而可以使得抽象部分和实现部分能够独立的变化。
桥梁模式的适用性
-
桥梁模式适用于开发者不希望某功能的抽象部分和它的实现部分有一个强关联的关系,这样在程序的运行期间,实现部分就可以自由的选择或者替换。
-
某功能的抽象部分和实现部分都应该可以通过生成子类的方式对其功能进行扩展,这是可以通过对抽象和实现部分不同的子类进行组合同时对他们进行扩展增加更加复杂的功能。
-
对抽象的实现部分进行修改不会的客户的使用产生影响。
桥梁模式的结构图
从结构图可以看出桥梁模式一共有两类结构,通过聚合的弱关联关系将两类结构关联起来:
-
抽象化角色(Abstration):抽象化角色主要是给出抽象化的定义同时保存一个对实现化角色的引用。
-
修正抽象化角色(RefinedAbstration):扩展抽象化觉得,同时对抽象角色的功能进行扩展和修正完成抽象化的定义。
-
实现化角色(Implementor):这个角色给出实现化角色的接口,但是不给出具体实现化的实现,这个接口可以不与抽象化角色的接口完全一致,一般而言实现化角色只提供基本操作,抽象化角色提供基于这些基本操作的更高层次的操作。
-
具体实现化角色(ConcreteImplementor):实现实现化角色的接口并给出具体的实现。
桥梁模式的实例
在一个针对于系统运行情况的预警系统中,我们会针对不同的错误情况进行不同的处理方式,例如:针对普通错误情况不影响系统的正常运转时可以通过邮件提醒的方式告知开发人员系统出现了小BUG;针对会影响系统正常运转的重大错误情况选择通过短信的方式告知开发人员并且加上一个已读回执,这样确保问题能够得到及时的处理。在这个基础上同时也有可能新增公司内部通讯软件的提醒或者在发送预警后过半个小时再次检查系统的情况。这样就会通过两种维度来扩展预警系统来发送预警信息:1、通过新增预警信息的发送渠道来扩展。2、通过对问题的严重等级进行扩展从而采取不同的应对方式。那么我们通过桥梁模式的方式来实现这个功能。
抽象化角色和实现化角色如下:
public abstract class AbstractionMessage { private MessageImplementor messageImplementor; public AbstractionMessage(MessageImplementor messageImplementor) { this.messageImplementor = messageImplementor; } public abstract void Operation(String message); }
public interface MessageImplementor { public void OperationImpl(String message); }
普通预警消息发送:
public abstract class AbstractionMessage { MessageImplementor messageImplementor; public AbstractionMessage(MessageImplementor messageImplementor) { this.messageImplementor = messageImplementor; } public abstract void Operation(String message); }
严重预警消息发送:
public class UrgencyMessage extends AbstractionMessage { public UrgencyMessage(MessageImplementor messageImplementor){ super(messageImplementor); } @Override public void Operation(String message) { message="加急"+message; super.messageImplementor.OperationImpl(message); } public String Receipt(){ return null; } }
发送邮件具体实现化角色:
public class MessageMail implements MessageImplementor { @Override public void OperationImpl(String message) { System.out.println("发送邮件,消息为:" + message); } }
发送短信具体实现化角色:
public class MessageSms implements MessageImplementor { @Override public void OperationImpl(String message) { System.out.println("发送短信,具体消息为:" + message); } }
客户端:
public class Client { public static void main(String[] args) { MessageImplementor messageImplementor1 = new MessageMail(); MessageImplementor messageImplementor2 = new MessageSms(); AbstractionMessage abstractionMessage = new CommonMessage(messageImplementor1); abstractionMessage.Operation("普通预警消息发送"); System.out.println("------------------------------"); AbstractionMessage abstractionMessage1 = new UrgencyMessage(messageImplementor2); abstractionMessage1.Operation("严重预警消息发送"); } }
通过观察上面对桥梁模式的实现例子,可以发现桥梁模式将系统的抽象化和实现化分离开了。通过新增消息的严重等级对发送消息的实现化是没有影响的,同时,新增发送消息的实现化方式对不同严重等级的消息发送也是没有影响的。
桥梁模式的优点
-
桥梁模式分离了接口及其实现部分,一个实现未必不变地绑定在一个接口上,抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。
-
桥梁模式提高了系统的可扩展性,开发者可以独立的对抽象化角色和实现化角色层次结构进行扩充。