zoukankan      html  css  js  c++  java
  • [工作中的设计模式]桥接模式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注入

  • 相关阅读:
    IOS 两种控制器的使用,纯代码UITabBarController 与 UINavigationController
    iOS UI控件总结(全)
    IOS 参数string 转成url
    CocoaPods 的使用与一些异常情况的处理
    创建自己的 FrameWork(含demo)-Xcode7环境
    UITextView 一些属性的设置
    跳转第二弹
    iOS--登录注册页面-趣享-接口设计
    《大道至简》第一章阅读笔记
    软件工程个人作业02
  • 原文地址:https://www.cnblogs.com/jyyzzjl/p/5156387.html
Copyright © 2011-2022 走看看