桥模式-设计模式

动机

  1. 由于某些类型的固有的实现逻辑,使得他们具有两个变化的维度,乃至多个维度的变化。
  2. 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

模式定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

类图

在这里插入图片描述

总结

  1. Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”它们。
  2. Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
  3. Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。

实例

场景:一个Message系统,系统中有一些公共方法,分别由PC和Mobile两个产品,同时每个产品又有精简版和完美版。

没有使用桥模式之前

没有稳定的framework供用户调用,代码没有做到开闭原则;同时代码重复率过高,不符合组合复用原则。

  1. 定义消息抽象类
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();
}
  1. 定义两个产品的基类
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");
    }
}
  1. 定义产品的业务类
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();
    }
}
  1. 定义用户使用框架类
public class MessageUser {
    
    
    // 静态绑定,不符合开闭原则。
    public void message() {
    
    
        MobileMessagePefect mobileMessagePefect = new MobileMessagePefect();
        mobileMessagePefect.sendMsg();
    }

    public static void main(String[] args) {
    
    
        MessageUser user = new MessageUser();
        user.message();
    }
}

使用桥模式之后

  1. 分拆Messge接口为两个类,因为是两个变化维度,使类的职责单一化
public interface MessageBase {
    
    
   void login();
   void sendMsg();
   void sendPic();
}
public interface MessageImp {
    
    
    void playSound();
    void writeText();
    void connect();
}
  1. 实现不同的产品
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");
    }
}
  1. 组合不同产品的实现,完善不同业务产品的功能
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();
    }
}
  1. 稳定用户框架的调用
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));
    }
}

猜你喜欢

转载自blog.csdn.net/tianzhonghaoqing/article/details/112205741