[工作中的设计模式]桥接模式bridge

一、模式解析:

  策略模式一节讲过,通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式。

  桥接模式定义为:将抽象部分与实现部分分离,使它们都可以独立的变化,在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,使用桥接模式可以应对多维度的变化。

  主要有两个要点

  1、有两个维度的变化,彼此的变化应该不会受到对方的干扰

  2、通过接口进行关联,共有n*m种组合

  3、其中一个维度,保存这另外一个维度的引用

二、模式代码:

  维度一

interface Implementor {
    public void operacitonImpl();
}
class ImplementorA implements Implementor{
    @Override
    public void operacitonImpl() {
        System.out.println("ImplementorA的方法被执行");
    }
}
class ImplementorB implements Implementor{
    @Override
    public void operacitonImpl() {
        System.out.println("ImplementorB的方法被执行");
        
    }
}

  维度二、

抽象代码,保存了维度一的引用,并且可以通过人工设置

public abstract class Abstraction {
    protected Implementor implementor;
    public void setImplementor(Implementor implementor){
        this.implementor=implementor;
    }
    public void operation(){};
}
public class RefinedAbstraction extends Abstraction {
    @Override
    public void operation() {
        System.out.println("RefinedAbstraction被执行了");
        implementor.operacitonImpl();
    }
}

客户端代码:

执行维度二,通过维度二调用维度一

public class Client {
    public static void main(String[] args) {
        Abstraction abstraction=new RefinedAbstraction();
        abstraction.setImplementor(new ImplementorA());
        abstraction.operation();
    }
}

三、应用场景

话接上一章策略模式,银行系统中转账不仅只有一种,比如有行内转账,跨行转账,二代支付等方式,每一种转账方式都需要计算手续费,因此在此我们将策略模式改造为桥接模式,因为手续费维度并没有变化,因此此处只需要修改转账维度

四,场景代码

定义转账接口,保留计算手续费接口

public abstract class ITransfer {
    protected IFee feeImpl;
    public void setIFee(IFee feeImpl){
        this.feeImpl=feeImpl;
    }
    public abstract void execute();
}

行内转账方法

public class TransferIn extends ITransfer {
    public void execute(){
        System.out.println("跨行转账开始。。。。");
        int fee=feeImpl.getFee();
        System.out.println("手续费为:"+fee);
        System.out.println("跨行转账完成。。。。");
    }
}

跨行转账方法

public class TransferOut extends ITransfer {
    public void execute(){
        System.out.println("跨行转账开始。。。。");
        int fee=feeImpl.getFee();
        System.out.println("手续费为:"+fee);
        System.out.println("跨行转账完成。。。。");
    }
}

客户端调用,可能是网银,柜面等渠道

public class Client {
    public static void main(String[] args) {
        ITransfer transfer=new TransferOut();
        transfer.setIFee(new FeeFromRemote());//项目中手续费计算方式通常由框架进行注入
        transfer.execute();
    }
}

执行结果

跨行转账开始。。。。
正在从核心获取手续费
手续费为:100
跨行转账完成。。。。

五、说明

实际使用过程中,并不会向Client中去初始化转账方法,然后直接设置手续费计算,通常转账作为一个路径资源进行访问,手续费计算方法通过spring的进行IOC注入

原文地址:https://www.cnblogs.com/jyyzzjl/p/5156387.html