在桥接模式中,两个类Abstraction和Implementor分别定义了抽象与行为类型的接口,通过调用两接口的子类实现抽象与行为的动态组合。
只看上面的各种介绍可能还是不容易理解,还是通过案例来看看吧!
比如不用软件运行在不同的操作系统上。
现在我们开始分析:不同的软件,代表的是软件维度,不同的操作系统是系统角度,运行 则是 具体要实现的功能。
注意:软件要运行 在操作系统上,因此最终软件 是实现运行的 实现部分,操作系统只是提供运行平台,属于更高维度,因此是抽象部分。
分析出对应角色:
Abstraction —》操作系统抽象类
RefinedAbstraction—》ios、Android、Windows等具体实现
Implementor----》软件接口类
ConcreteImplementor—》微信、QQ、酷狗音乐等具体实现
桥接模式分为两部分 抽象部分 和 实现部分 两部分代码
1 实现部分的代码如下:
// 之所以叫实现部分,是因为这部分的代码才是实际功能的实现, // 抽象部分只是对他进行了一个引用和包装 //1 首先定义一个 软件接口类【Implementor】 public abstract class AbstractSoftware { //定义一个启动软件的方法 public abstract void Start(); } //2 在定义软件接口的实现类【ConcreteImplementor】 public class QQ : AbstractSoftware { public override void Start() { Console.WriteLine("QQ 启动了!"); } } public class WeChat : AbstractSoftware { public override void Start() { Console.WriteLine("WeChat 启动了!"); } }
2 抽象部分的代码如下:
// 定义操作系统抽象类【Abstraction】 // 该类为实际的桥接类,并且还规范了更高一层的方法。 public abstract class AbstractSysPlatform { //定义AbstractSoftware 变量,保持对该对象的引用 //因为需要该变量进行桥接的操作 public AbstractSoftware _AbstractSoftware; public AbstractSysPlatform(AbstractSoftware abstractSoftware) { _AbstractSoftware = abstractSoftware; } //定义一个 系统上运行软件的方法,供子类去实现 //该方法为更高一层的方法 public abstract void Run(); } //定义一个操作系统Windows的实现类 public class Windows : AbstractSysPlatform { public Windows(AbstractSoftware abstractSoftware) : base(abstractSoftware) { } //我们要实现在Windows上运行软件的方法 public override void Run() { Console.WriteLine("当前为Windows系统"); _AbstractSoftware.Start(); } } //定义一个操作系统IOS的实现类 public class IOS : AbstractSysPlatform { public IOS(AbstractSoftware abstractSoftware) : base(abstractSoftware) { } //我们要实现在IOS上运行软件的方法 public override void Run() { Console.WriteLine("当前为IOS系统"); _AbstractSoftware.Start(); } }
3 客户端调用
static void Main(string[] args) { //在WIndows上运行QQ AbstractSoftware qq = new QQ(); AbstractSysPlatform win = new Windows(qq); win.Run(); //在IOS上运行WeChat AbstractSoftware weChat = new WeChat(); AbstractSysPlatform ios = new IOS(weChat); ios.Run(); Console.ReadKey(); }
4 应对需求变化
当我们的新增了一个软件抖音,我们只需要,新增如下代码即可:
public class Tiktok : AbstractSoftware { public override void Start() { Console.WriteLine("Tiktok 启动了!"); } }
就可以在不改动原有代码的情况了,客户端只需调用相关代码就可实现 抖音在Window 和 IOS 上的运行。
如果我们还想增加一个操作系统平台,也只需要新增如下代码:
public class Android : AbstractSysPlatform { public Android(AbstractSoftware abstractSoftware) : base(abstractSoftware) { } public override void Run() { Console.WriteLine("当前为Android系统"); _AbstractSoftware.Start(); } }
同样可以在不修改原有代码的情况下,客户端只需调用相关代码就可实现QQ,WeChat,Tiktok 在Android 平台上的运行。
我们发现,桥接模式可以极好的处理两种维度存在变化,但是两个维度间又有联系的这种情况,并且可以做到少量代码的新增,得到极大的功能扩展。
优点:将抽象部分与它的实现部分分离,使它们都可以独立地变化
缺点:增加了系统的复杂度
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料:
C#设计模式之七桥接模式(Bridge Pattern)【结构型】
C#桥接模式详解
上一篇:python命令行解析