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