二、桥接模式
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
桥接模式示例
下面我们以发消息为例来进行说明,首先消息类型是一个维度,比如可以发邮件,发短信。然后消息可以有紧急消息,普通消息,这又是一个具体的维度。
1、首先新建一个消息接口类:
package com.zwx.design.pattern.bridge; public interface IMessage { void send(String content,String toUser); }
2、新建两个实现类,分别是邮件消息和短信消息:
package com.zwx.design.pattern.bridge; public class EmailMessage implements IMessage { @Override public void send(String content, String toUser) { System.out.println(String.format("邮件消息->%s:%s",toUser,content)); } }
package com.zwx.design.pattern.bridge; public class SmsMessage implements IMessage { @Override public void send(String content, String toUser) { System.out.println(String.format("SMS消息->%s:%s",toUser,content)); } }
假如这时候我们需要按照普通消息和紧急消息来做一些不同的事情,那么这时候普通写法会怎么写,我想可能会是如下写法,直接改写消息类,在分别去实现紧急消息类和普通消息类:
public class SmsMessage extends CommonMsg implements IMessage {
但是Java是单继承,所以一次只能继承一个,要么就把普通消息和紧急消息设置为接口,要么就作为组合的形式,将紧急消息和普通消息分别作为属性存到对应的消息类型里面去。但是不论是哪种形式,都需要修改原先的SmsMessage 类。
所以这时候就需要使用桥接模式,将抽象(消息类型)与实现(消息紧急程度)进行分离。
3、新建一个抽象类,将IMessage集成进去:
package com.zwx.design.pattern.bridge; public abstract class AbstractMessage { private IMessage iMessage; public AbstractMessage(IMessage iMessage) { this.iMessage = iMessage; } public void sendMessage(String content,String toUser){ this.iMessage.send(content,toUser); } }