java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java桥接模式

Java结构型设计模式之桥接模式详细讲解

作者:丨Jack_Chen丨

桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下

桥接模式

概述

桥接模式(Bridge Pattern)也称为桥梁模式、接口(Interfce)模式或柄体(Handle and Body)模式,属于结构型模式。

它是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。

桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥接模式的核心在于解耦抽象和实现。

应用场景

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构隐定。

适用业务场景:

1.在抽象和具体实现之间需要增加更多的灵活性的场景。

2.一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。

3.不希望使用继承,或因为多层继承导致系统类的个数剧增。

优缺点

优点:

1.分离抽象部分及其具体实现部分

2.提高了系统的扩展性

3.实现细节对客户透明

缺点:

1.增加了系统的理解与设计难度

2.需要正确地识别系统中两个独立变化的维度

主要角色

1.抽象(Abstraction)

该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)。

2.修正抽象(RefinedAbstraction)

抽象的具体实现,对抽象的方法进行完善和扩展。

3.实现(Implementor)

确定实现维度的基本操作,提供给抽象使用。该类一般为接口或抽象类。

1.具体实现(Concretelmplementor)

实现的具体实现。

桥接模式的基本使用

创建实现角色

public interface IImplementor {
    void operationImpl();
}

创建具体实现角色

public class ConcreteImplementorA implements IImplementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorA operationImpl");
    }
}
public class ConcreteImplementorB implements IImplementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorB operationImpl");
    }
}

创建抽象角色

public abstract class Abstraction {
    protected IImplementor mImplementor;
    public Abstraction(IImplementor implementor) {
        this.mImplementor = implementor;
    }
    public void operation() {
        this.mImplementor.operationImpl();
    }
}

创建修正抽象角色

public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(IImplementor implementor) {
        super(implementor);
    }
    @Override
    public void operation() {
        super.operation();
        System.out.println("RefinedAbstraction operation");
    }
}

客户端调用

    public static void main(String[] args) {
        // 来一个实现化角色
        IImplementor impA = new ConcreteImplementorA();
        IImplementor impB = new ConcreteImplementorB();
        // 来一个抽象化角色,聚合实现
        Abstraction absA = new RefinedAbstraction(impA);
        Abstraction absB = new RefinedAbstraction(impB);
        // 执行操作
        absA.operation();
        absB.operation();
    }

ConcreteImplementorA operationImpl
RefinedAbstraction operation
ConcreteImplementorB operationImpl
RefinedAbstraction operation

桥接模式实现消息发送

使用桥接模式解耦消息类型与消息重要程度。

创建实现角色

创建实现角色,担任桥接角色,实现消息发送的统一接口

public interface IMessage {
    void send(String message);
}

创建具体实现角色

public class EmailMessage implements IMessage {
    @Override
    public void send(String message) {
        System.out.println("使用邮件消息发送" + message);
    }
}
public class SmsMessage implements IMessage {
    @Override
    public void send(String message) {
        System.out.println("使用短信消息发送" + message);
    }
}

创建抽象角色

创建抽象角色,担任桥接抽象角色,持有实现角色,且发送消息委派给实现对象发送

public abstract class AbastractMessage {
    // 持有实现角色的引用
    private IMessage message;
    // 构造函数,传入实现角色的引用
    public AbastractMessage(IMessage message) {
        this.message = message;
    }
    // 发送消息的方法,调用实现角色的方法
    void sendMessage(String message){
        this.message.send(message);
    }
}

创建修正抽象角色

创建普通消息

public class NomalMessage extends AbastractMessage {
    public NomalMessage(IMessage message) {
        super(message);
    }
}

创建重要消息

public class ImportanceMessage extends AbastractMessage {
    public ImportanceMessage(IMessage message) {
    	message = message + "【重要消息】";
        super(message);
    }
    void sendMessage(String message){
        super.sendMessage(message);
    }
}

客户端调用

    public static void main(String[] args) {
        IMessage message = new EmailMessage();
        AbastractMessage abastractMessage = new NomalMessage(message);
        abastractMessage.sendMessage("hello world");
        message = new SmsMessage();
        abastractMessage = new ImportanceMessage(message);
        abastractMessage.sendMessage("hello world");
    }

使用邮件消息发送hello world
使用短信消息发送hello world【重要消息】

到此这篇关于Java结构型设计模式之桥接模式详细讲解的文章就介绍到这了,更多相关Java桥接模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文