目录
一、基础概念
二、UML类图
三、角色分析
四、案例分析
1、支付方式
2、支付渠道
五、总结
一、基础概念
桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。
桥接模式的核心思想是把抽象(abstraction)与实现(implementation)分离开来,从而可以独立变化。
抽象类定义抽象接口,包含对实现对象的引用。
实现类提供各种实现方案,抽象接口调用实现对象的相关方法完成工作。
这样抽象部分和实现部分就可以通过抽象层建立联系,相互独立地变化而不影响对方。
二、UML类图
三、角色分析
角色 | 描述 |
---|---|
抽象类(Abstraction) | 定义抽象类,并包含一个对实现类对象的引用。例如:支付渠道抽象类。 |
扩展抽象类(Refined Abstraction) | 扩展该抽象类,改变和修饰该抽象类的接口。例如:微信支付渠道和支付支付渠道的扩展抽象类。 |
实现类接口(Implementor) | 定义实现类接口,供扩展抽象类调用。例如:支付方式接口。 |
具体实现类(Concrete Implementor) | 实现类接口的具体实现。例如:密码支付、指纹支付和人脸支付的具体实现。 |
四、案例分析
在日常生活中不管用什么渠道进行支付,例如支付宝、微信支付和云闪付等,它们都提供了三种支付方式,分别是密码支付、指纹支付和人脸支付,下面就通过代码来实现这个例子让大家更容易去理解这个设计模式。
1、支付方式
定义支付方式的接口:
package mode;
public interface PayMode {
void mode();
}
密码支付实现类:
package mode;
public class PwdPayMode implements PayMode {
@Override
public void mode() {
System.out.println("密码支付");
}
}
指纹支付实现类:
package mode;
public class FingerPayMode implements PayMode{
@Override
public void mode() {
System.out.println("指纹支付");
}
}
人脸支付实现类:
package mode;
public class FacePayMode implements PayMode {
@Override
public void mode() {
System.out.println("人脸支付");
}
}
2、支付渠道
定义支付渠道的抽象类:
package channel;
import mode.PayMode;
public abstract class PayAbstract {
protected PayMode payMode;
public PayAbstract(PayMode payMode) {
this.payMode = payMode;
}
public abstract void transfer();
}
支付渠道抽象类子类-支付宝:
package channel;
import mode.PayMode;
public class ZfbPay extends PayAbstract {
public ZfbPay(PayMode payMode) {
super(payMode);
}
@Override
public void transfer() {
System.out.println("支付宝渠道");
this.payMode.mode();
}
}
支付渠道抽象类子类-微信:
package channel;
import mode.PayMode;
public class WxPay extends PayAbstract {
public WxPay(PayMode payMode) {
super(payMode);
}
@Override
public void transfer() {
System.out.println("微信渠道");
this.payMode.mode();
}
}
以上就把整体的代码核心逻辑都撰写完毕了,接下来我们运行写个主方法测试一下,代码示例如下:
public class Main {
public static void main(String[] args) {
PayAbstract wxPay = new WxPay(new PwdPayMode());
wxPay.transfer();
PayAbstract wxPay2 = new WxPay(new FingerPayMode());
wxPay2.transfer();
PayAbstract wxPay3 = new WxPay(new FacePayMode());
wxPay3.transfer();
PayAbstract zfbPay = new ZfbPay(new PwdPayMode());
zfbPay.transfer();
PayAbstract zfbPay2 = new ZfbPay(new FingerPayMode());
zfbPay2.transfer();
PayAbstract zfbPay3 = new ZfbPay(new FacePayMode());
zfbPay3.transfer();
}
}
运行结果如下:
五、总结
优点:
1、抽象和实现分离,提高了扩展性,符合开闭原则。
2、实现细节对客户透明,可以对客户端隐藏变化。
3、符合组合复用原则,不使用继承提高复用性。
缺点:
增加了系统的复杂性。
应用场景:
1、一个抽象有多种实现需要动态切换时。
2、系统需要在多个平台上运行时。
3、一个抽象有多个变化维度需要独立扩展。
符合的原则:
1、单一职责原则(Single Responsibility Principle)
桥接模式实现了抽象部分和实现部分的分离,使它们各自只需要关注一个单一的职责。
2、开闭原则(Open Closed Principle)
桥接模式使抽象部分和实现部分可以独立扩展开放,而不需要修改对方的代码。
3、组合复用原则(Composite Reuse Principle)
桥接模式充分利用了组合和聚合关系增加系统的复用性。
4、里氏替换原则(Liskov Substitution Principle)
抽象部分针对接口编程,其引用实现类对象可以替换为其子类,继续运行。
5、依赖倒转原则(Dependency Inversion Principle)
抽象部分和实现部分通过接口联系,实现了面向接口编程隔离了依赖关系。
总的来说桥接模式通过抽象和实现分离,实现解耦,让它们可以独立变化,从而保持高扩展性。