• [工作中的设计模式]桥接模式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注入

  • 相关阅读:
    反向代理实例
    nginx常用命令和配置
    nginx的安装
    Can Live View boot up images acquired from 64bit OS evidence?
    What is the behavior of lnk files?
    EnCase v7 search hits in compound files?
    How to search compound files
    iOS 8.3 JB ready
    Sunglasses
    现代福尔摩斯
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5156387.html
Copyright © 2020-2023  润新知