设计模式:桥接模式学习

450 阅读2分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

基础

桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

适合应用场景

  • 你想要拆分或重组一个具有多重功能的庞杂类,可以使用桥接模式。
  • 希望在几个独立维度上扩展一个类, 可使用该模式。
  • 需要在运行时切换不同实现方法, 可使用桥接模式。

优缺点

  • 客户端代码仅与高层抽象部分进行互动,不会接触到平台的详细信息。
  • 开闭原则。 你可以新增抽象部分和实现部分, 且它们之间不会相互影响。
  • 单一职责原则。 抽象部分专注于处理高层逻辑, 实现部分处理平台细节。
  • 对高内聚的类使用该模式可能会让代码更加复杂

举例

下面举得例子是关于支付的,支付方式有微信支付、支付宝支付,再具体下去有

  • 微信密码支付
  • 微信指纹支付
  • 支付宝密码支付
  • 支付宝指纹支付

思路

以上两两组合,可以把通过桥接模式设计思想,将其分为抽象部分和实现部分,一个支付方式里面有若干支付模式(如微信支付有密码、指纹支付),因此将支付方式 设置为抽象部分,将支付模式设置为实现部分,抽象类依赖于实现类,后续如果再新增一个支付方式或者支付模式,都能较好的扩展。

代码实践

支付模式实现类

/**
 * 支付模式,如指纹、密码
 */
public interface IPayModel {
    String payModel();
}
/**
 * @author 勤任风
 * @date 2021-08-28 15:05
 * 密码模式
 */
public class PasswordPayModel implements IPayModel {
    @Override
    public String payModel() {
        return "【密码模式】";
    }
}
/**
 * @author 勤任风
 * @date 2021-08-28 15:04
 * 指纹模式
 */
public class FingerprintPayModel implements IPayModel {
    @Override
    public String payModel() {
        return "【指纹模式】";
    }
}

支付方式抽象类

/**
 * @author 勤任风
 * @date 2021-08-28 17:22
 * 支付方式,如微信、支付宝
 */
public abstract class AbstractPayType {

    protected IPayModel iPayModel;

    public AbstractPayType(IPayModel iPayModel) {
        this.iPayModel = iPayModel;
    }

    protected abstract void pay();
}
/**
 * @author 勤任风
 * @date 2021-08-28 17:25
 * 支付宝支付
 */
public class AliPayType extends AbstractPayType {

    public AliPayType(IPayModel iPayModel) {
        super(iPayModel);
    }

    @Override
    public void pay() {
        System.out.println("通过"+iPayModel.payModel()+" 进行支付宝支付");
    }
}
/**
 * @author 勤任风
 * @date 2021-08-28 17:25
 * 微信支付
 */
public class WeChatPayType extends AbstractPayType {
    public WeChatPayType(IPayModel iPayModel) {
        super(iPayModel);
    }

    @Override
    public void pay() {
        System.out.println("通过"+iPayModel.payModel()+" 进行微信支付");
    }
}

测试类

/**
 * @author 勤任风
 * @date 2021-08-28 17:31
 */
public class BridgeTest {
    public static void main(String[] args){
        new WeChatPayType(new PasswordPayModel()).pay();
        new WeChatPayType(new FingerprintPayModel()).pay();
        new AliPayType(new PasswordPayModel()).pay();
        new AliPayType(new FingerprintPayModel()).pay();
    }
}

测试结果

image.png

参考

www.cnblogs.com/xiaofuge/p/…

refactoring.guru/design-patt…