设计模式-桥接模式

桥接模式

桥接模式(bridge)也成为桥梁模式,接口(Interface)模式,柄体(Handle And Body)模式,是将抽象部分与它的具体实现部分分离,使得它们可以独立的变化,属于结构型模式。
桥接模式主要是通过组合的方式建立两个类之间的关系,而不是继承。但又类似于多重继承方案,但是多重继承方案往往违背了的单一职责原则,其复用性比较差,桥接模式是比多重继承方案更好的替代方案。
桥接模式的核心在于解耦抽象和实现。
桥接模式主要包含四种角色

  • ①抽象Abstraction:该类持有一个对实现角色的引用,抽象角色的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)
  • ②修正抽象RefinedAbstraction:Abstraction的具体实现,对Abstraction的方法进行完善和扩展。
  • ③实现Implementor:确定实现维度的基本操作,提供给Abstraction使用,该类一般为接口或实现类。
  • ④具体实现ConcreteImplementor:Implementor的具体实现。

应用场景

  • 在抽象和具体之间需要增加更多的灵活性的场景
  • 一个类中存在两个或多个独立变化的维度,而这些维度可能需要扩展
    不希望使用继承或因为多继承导致系统类的个数剧增

举例:
平时工作中 我们发消息 可以通过手机发送,邮件发送,以及内部系统发送。消息级别可以是普通,加急,特急消息。

package com.jdwa.bridge;

public interface IMessage {
    void send(String message,String toUser);
}
package com.jdwa.bridge;

public class PhoneMessage implements IMessage {
    @Override
    public void send(String message, String toUser) {
        System.out.println(String.format("使用手机的方式发送消息 %s 给 %s",message,toUser));
    }
}
package com.jdwa.bridge;

public class EmailMessage implements IMessage {

    @Override
    public void send(String message, String toUser) {
        System.out.println(String.format("使用邮件的方式发送消息 %s 给 %s",message,toUser));
    }
}
package com.jdwa.bridge;

public class SystemMessage implements IMessage {
    @Override
    public void send(String message, String toUser) {
        System.out.println(String.format("使用内部系统的方式发送消息 %s 给 %s",message,toUser));
    }
}
package com.jdwa.bridge;

public abstract class AbstractMessage {
    private IMessage message;
    
    public AbstractMessage (IMessage message){
        this.message = message;
    }
    
    public void senMessage(String message,String toUser){
        this.message.send(message, toUser);
    }
}
package com.jdwa.bridge;

public class NomalMessage extends AbstractMessage{

    private IMessage message;

    public NomalMessage(IMessage message){
        super(message);
    }


    @Override
    public void senMessage(String message,String toUser){
        message = "【普通】"+message;
        super.senMessage(message, toUser);
    }


}
package com.jdwa.bridge;

public class UrgencyMessage extends AbstractMessage{
    public UrgencyMessage(IMessage message) {
        super(message);
    }

    @Override
    public void senMessage(String message,String toUser){
        message = "【加急】"+message;
        super.senMessage(message, toUser);
    }
}
package com.jdwa.bridge;

public class ExtraUrgency extends AbstractMessage {
    public ExtraUrgency(IMessage message) {
        super(message);
    }

    @Override
    public void senMessage(String message,String toUser){
        message = "【加急】"+message;
        super.senMessage(message, toUser);
    }
}
package com.jdwa.bridge;

public class Client {
    public static void main(String[] args) {
        IMessage message = new EmailMessage();
        AbstractMessage abstractMessage = new NomalMessage(message);
        abstractMessage.senMessage("加班申请","王总");

        IMessage message1 = new SystemMessage();
        AbstractMessage abstractMessage1 = new UrgencyMessage(message1);
        abstractMessage1.senMessage("请假","张总");

        IMessage message2 = new PhoneMessage();
        AbstractMessage abstractMessage2 = new ExtraUrgency(message2);
        abstractMessage2.senMessage("调休","陈总");

    }
}
使用邮件的方式发送消息 【普通】加班申请 给 王总
使用内部系统的方式发送消息 【加急】请假 给 张总
使用手机的方式发送消息 【加急】调休 给 陈总
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

posted @ 2024-06-13 14:44  东方欲晓_莫道君行早  阅读(3)  评论(0编辑  收藏  举报