设计模式(6)——单一职责模式(2)——桥接模式

it2022-05-05  121

目录

1.基本介绍

2.动机

3.类图

4.案例

5.总结


1.基本介绍

定义: 将抽象部分与实现部分分离,使它们都可以独立地变化是一种结构型设计模式Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展

2.动机

由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

3.类图

Client:桥接模式的调用者抽象类(Abstraction):组合了Implementor,充当了桥接类,它通过组合的方式将抽象和实现桥接起来RefinedAbstraction:抽象类的子类Implementor:行为实现类的接口ConcreteImplementorA和ConcreteImplementorB:行为实现类从UML类图可以看出,抽象类和实现类是调用和被调用的关系

4.案例

案例:手机操作问题

需求:

现在对不同手机类型的不同品牌实现操作编程(比如开机,关机,上网,打电话等),如图

传统方式设计:

分析问题:

扩展性问题:当我们要增加一个新的样式,就需要在它下面增加对应的三种品牌的手机;当我们要增加一种手机,就需要在每个样式下面增加该手机违反了单一原则,当我们增加手机样式时,要同时增加所有品牌的手机

桥接模式实现:

实现类:

Brand.java

package cn.cqu.bridge; public interface Brand { void open(); void close(); void call(); }

XiaoMi.java

package cn.cqu.bridge; public class XiaoMi implements Brand{ @Override public void open() { System.out.println("小米手机开机了"); } @Override public void close() { System.out.println("小米手机关机了"); } @Override public void call() { System.out.println("小米手机打电话了"); } }

Vivo.java

package cn.cqu.bridge; public class Vivo implements Brand{ @Override public void open() { System.out.println("Vivo手机开机了"); } @Override public void close() { System.out.println("Vivo手机关机了"); } @Override public void call() { System.out.println("Vivo手机打电话了"); } }

抽象类:

Phone.java

package cn.cqu.bridge; public abstract class Phone { protected Brand brand; public Phone(Brand brand) { this.brand = brand; } protected void open(){ this.brand.open(); } protected void close(){ this.brand.close(); } protected void call(){ this.brand.call(); } }

FolderPhone.java

package cn.cqu.bridge; public class FolderPhone extends Phone { public FolderPhone(Brand brand) { super(brand); } //这里的open先找到抽象类Phone的open, // Phone中的open通过组合的Brand接口调用Brand的实现类的open @Override protected void open() { super.open(); System.out.println("折叠样式手机"); } @Override protected void close() { super.close(); System.out.println("折叠样式手机"); } @Override protected void call() { super.call(); System.out.println("折叠样式手机"); } }

UpRightPhone.java

package cn.cqu.bridge; public class UpRightPhone extends Phone{ public UpRightPhone(Brand brand) { super(brand); } @Override protected void open() { super.open(); System.out.println("直立样式手机"); } @Override protected void close() { super.close(); System.out.println("直立样式手机"); } @Override protected void call() { super.call(); System.out.println("直立样式手机"); } }

Client.java

package cn.cqu.bridge; public class Client { public static void main(String[] args) { //获取折叠式手机(样式+品牌) Phone phone1 = new FolderPhone(new XiaoMi()); phone1.open(); phone1.call(); phone1.close(); System.out.println("======================="); //获取直立样式手机(样式+品牌) Phone phone2 = new FolderPhone(new Vivo()); phone2.open(); phone2.call(); phone2.close(); } }

我们不管要增加手机样式还是增加手机品牌,我们只需要去添加一个类继承对应的父类即可,而不用去修改其他的子类

5.总结

1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化,所谓抽象和实现沿着各自维度的变化,即“子类化”它们2.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法3.Bridge模式的应用一般在“两个非常强的变化维度”,有时候一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式4.桥接模式的常用应用场景 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用常见场景: JDBC驱动程序银行转账系统 转账分类:网上转账、柜台转账、AMT转账转账用户类型:普通用户、银行卡用户、金卡用户消息管理: 消息类型:即时消息、延时消息消息分类:手机短信、邮件消息、QQ消息

最新回复(0)