📚 A公司需要开发一款新的桌面应用程序,需要为此程序设计用户界面,这个程序需要支持在Windows、MacOS和Linux操作系统上运行,而且需要在每一种系统实现对应的用户界面元素,比如:按钮、文本框和窗口等。
🧠 对于上述问题,我们很容易就能想到解决办法——我们可以设置一个按钮类,让Windows、MacOS和Linux的按钮都继承这个按钮类,然后实现具体的属性和方法,文本框和窗口也使用同样的方法,如下图。
看到这个图片你有没有感觉头皮发麻~😂这个类图中采用了多层继承结构,导致类的个数成倍增长。
🙋♂️ 上述问题就需要我们这篇文章
讲解的桥
接模式来解决,减少系统开销,使扩展时更加简单。
桥接模式
就是将抽象部分与其实现部分分离,使他们可以独立的变化,这种分离允许抽象部分和实现部分可以独立地扩展、修改和重用,从而提高了系统的灵活性、可扩展性和可维护性。
❓ 什么是抽象部分? 什么又是实现部分呢?
🏷️ 桥接模式就是找出系统中发生变化的两个维度,将这两个维度分离出来,使两者可以进行扩展,然后将两者连接起来,像一个桥一样,它们之间可以协同工作,又可以独立变化。这两个维度可以定义
为类的功能层
次和类的实现层
次。
一般来说,我们将与这个类的一些功能业务方法和与这个类有关的最密切的维度定义为类的功能层次;
💯 开头的案例中,我们发现了两个变化的维度——
元素
和操作系统
,在这个系统中,我们具体的实现功能是和操作系统有关的,所以实现部分应该是操作系统
,而在我们的系统中,主要是做一些元素的显示功能,这个维度是和我们的功能业务关系最密切的,所以抽象部分应该是元素
。
桥接模式由以下角色组成:
// 抽象类
abstract class Abstraction {
// 实现类接口的引用
private Implementor impl;
public void setImpl(Implementor impl) {
this.impl = impl;
}
// 定义公共的业务方法
public abstract void oper();
}
class RefinedAbstraction extends Abstraction {
// 实现抽象类中的业务方法
public void oper() {
impl.operImpl(); // 调用实现类的实现方法
}
}
// 实现类的接口
interface Implementor {
void operImpl();
}
// 具体实现类
class ConcreteImplementor implements Implementor {
public void operImpl() {
// 具体实现的方法
}
}
我们在
结构
最后分析了开头案例的两个维度,使用元素作为我们的抽象部分,使用操作系统平台作为我们的实现部分,这节我们就开始实现功能代码吧。
0️⃣ 定义一个元素类的抽象类
public abstract class Element {
public ElementImpl elementImpl;
public void setElementImpl(ElementImpl elementImpl) {
this.elementImpl = elementImpl;
}
public abstract void showElement();
}
1️⃣ 定义元素的扩充抽象类
public class ButtonElement extends Element {
@Override
public void showElement() {
elementImpl.show();
System.out.println("Button");
}
}
public class TextBoxElement extends Element {
@Override
public void showElement() {
elementImpl.show();
System.out.println("TextBox");
}
}
public class WindowElement extends Element {
@Override
public void showElement() {
elementImpl.show();
System.out.println("Window");
}
}
2️⃣ 定义实现类接口
public interface ElementImpl {
void show();
}
3️⃣ 定义具体实现类
public class WindowsImpl implements ElementImpl {
@Override
public void show() {
System.out.println("Windows 展示:");
}
}
public class MacImpl implements ElementImpl {
@Override
public void show() {
System.out.println("MacOS 展示:");
}
}
public class LinuxImpl implements ElementImpl {
@Override
public void show() {
System.out.println("Linux 展示:");
}
}
📖 使用这种方式,如果我们新增一个操作系统,我们只需要用新的操作系统实现
ElementImpl
接口,就可以了;如果我们新增一个元素,我们只需要用新的元素继承Element
抽象类即可。这样比上面一开始那种多层继承结构方便多了。
✅️ 优点:
分离抽象和实现部分。
通过使系统中抽象部分和实现部分分离开来,使可以独立变化,这样系统的抽象部分和实现部分可以单独扩展、修改和重用,提高了系统的灵活性和可维护性;抽象部分和实现部分解耦。
由于实现部分和抽象部分独立出来,抽象部分不知道具体的实现细节,降低系统复杂性;❌ 缺点:
增加系统复杂度。
在设计和理解系统时,需要识别系统中抽象部分和实现部分的关系,识别这个关系需要有一定的经验积累;在软件开发的过程中,我们如果遇到一个类或者一个系统有多个维度的变化,都可以尝试使用桥接模式进行系统设计。学会识别两个维度的功能变化和实现变化,积累自己设计经验哦~
欢迎朋友们关注我的公众号📢📢📢:【码匠er】
我会持续更新关于技术的文章❤️🤎💚🧡💛
欢迎大家点赞👍 收藏 ⭐ 关注 💡三连支持一下~~~
查看文章过程中有问题或者有需要修改的地方,欢迎私聊我哦 🗨🗨🗨
不管世界变成什么样,我们都要加强自己自身能力~✊✊✊
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。