Welcome everyone

初识桥接模式

设计模式 汪明鑫 20浏览 0评论

前言

解耦抽象和实现,使得两者可以独立的变化。

多重继承的替代方案

此处的 抽象 并不是指 抽象类 或 接口 这种高层概念,实现 也不是 继承 或 接口实现 。

抽象 与 实现 其实指的是两种独立变化的维度。其中,抽象 包含 实现,因此,一个 抽象 类的变化可能涉及到多种维度的变化导致的。

两个维度可以独立的变化

 

Java日志系统中很多用到了桥接模式

这个设计模式感觉有一定难度,虽然有一定的概念,但整体上比较模糊

 

使用场景

对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统

可能会按照不同的维度扩展

 

类图

 

 

例子

public interface BridgeInterface {
    void process(String request);
}
public class LoginBridge implements BridgeInterface{
    @Override
    public void process(String request) {
        System.out.println("do login "+request);
    }
}
public abstract class ChannelAbstractClass {
    protected Map<String,BridgeInterface> bridgeInterfaces = new HashMap<>();

    public void realProces(String action,String request){
        bridgeInterfaces.get(action).process(request);
    }

    public abstract void setBridgeInterfaces(BridgeInterface bridgeInterface);
}
public class LoginChannel extends ChannelAbstractClass {

    private final static String LOGIN_ACTION = "login";

    @Override
    public void setBridgeInterfaces(BridgeInterface bridgeInterface) {
        bridgeInterfaces.put(LOGIN_ACTION,bridgeInterface);
    }
}
public static void main(String[] args) {
        String request = "[login request at " + LocalDateTime.now() + "]";
        BridgeInterface login = new LoginBridge();
        ChannelAbstractClass channel = new LoginChannel();
        channel.setBridgeInterfaces(login);
        channel.realProces("login",request);

输出:

do login [request at 2019-08-26T16:25:20.200]

如果需要扩展

多加一个桥接接口,就多加一个channel

多维度的变化

 

public class LoginoutBridge implements BridgeInterface {
    @Override
    public void process(String request) {
        System.out.println("do loginout "+request);
    }
}
public class LoginoutChannel extends ChannelAbstractClass{

    private final static String LOGINOUT_ACTION = "loginout";

    @Override
    public void setBridgeInterfaces(BridgeInterface bridgeInterface) {
        bridgeInterfaces.put(LOGINOUT_ACTION,bridgeInterface);
    }
}
 public static void main(String[] args) {
        String request = "[login request at " + LocalDateTime.now() + "]";
        BridgeInterface login = new LoginBridge();
        ChannelAbstractClass channel = new LoginChannel();
        channel.setBridgeInterfaces(login);
        channel.realProces("login",request);

        request = "[loginout request at " + LocalDateTime.now() + "]";
        BridgeInterface loginout = new LoginoutBridge();
        channel = new LoginoutChannel();
        channel.setBridgeInterfaces(loginout);
        channel.realProces("loginout",request);

    }

do login [login request at 2019-08-26T16:33:11.128]
do loginout [loginout request at 2019-08-26T16:33:11.129]

 

小结

  • 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实
    现部分独立开来, 这有助于系统进行分层设计,从而产生更好的结构化系统。
  • 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部
    分由具体业务来完成。
  • 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
  • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,
    要求开发者针对抽象进行设计和编程
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局
    限性,即需要有这样的应用场景。

转载请注明:汪明鑫的个人博客 » 初识桥接模式

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz