移动APP为什么要开发两套Android和IOS-桥接模式
一、前言
现在用H5开发个 web app 多么方便,兼容两大系统Andriod和IOS。但是为什么许多公司还要开发原生的APP?开发原生的APP就需要开发两套一套运行在Andriod系统的,一套运行在IOS系统的,麻不麻烦啊?
我咨询了一个专业做移动端的朋友说:H5做展示性的还可以,交互太多还是需要做原生的!具体我不懂不做过多描述了。
其实开发几套和我们今天的主题的没有多大的关系,只是一个引子。
今天就一支付宝、微信的例子解说最近正在看的设计模式-桥接模式。
例子只是加深对桥接模式的理解!!!
例子只是加深对桥接模式的理解!!!
例子只是加深对桥接模式的理解!!!
二、基本概念
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
简单的理解就是将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化。
在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式。
Bridge模式使用“对象间的组合/聚合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。
桥接模式包含四个角色:
抽象(Abstraction):定义抽象接口,该接口中包含实现具体行为、具体特征的Implementor接口。
提炼的抽象(RefinedAbstraction):继承自Abstraction的子类,依旧是一个抽象的事物名。
实现(Implementor):定义具体行为,具体特征的应用接口。
具体实现(ConcreteImplementor):实现Implementor。
三、代码
基本的代码实现:
//实现类接口角色 public abstract class Implementor { public abstract void Opration(); } //具体实现类A角色 public class ConcreteImplementorA : Implementor { public override void Opration() { Console.WriteLine("A Opration"); } } //具体实现类B角色 public class ConcreteImplementorB : Implementor { public override void Opration() { Console.WriteLine("B Opration"); } } //抽象类角色 public abstract class Abstraction { public abstract void Opration(Implementor implementor); } //扩充抽象类角色 public class RefinedAbstraction : Abstraction { public override void Opration(Implementor implementor) { implementor.Opration(); } } static void Main(string[] args) { Abstraction abstraction = new RefinedAbstraction(); abstraction.Opration(new ConcreteImplementorA()); abstraction.Opration(new ConcreteImplementorB()); Console.ReadKey(); }
运行结果如下:
支付宝和微信app 示例代码:
//抽象类角色:APP应用 public abstract class Application { public abstract void Write(); } //具体实现类角色:支付宝app public class Alipay : Application { public override void Write() { Console.WriteLine("改变,因我而来!-支付宝"); } } //具体实现类角色:微信app public class Weixin : Application { public override void Write() { Console.WriteLine("微信,是一个生活方式!"); } } //扩充抽象类角色:手机系统 public abstract class MobileSystem { public abstract void TaskOpen(Application app); } //扩充抽象类角色:Android系统 public class Android : MobileSystem { public override void TaskOpen(Application app) { app.Write(); } } //扩充抽象类角色:IOS系统 public class Ios:MobileSystem { public override void TaskOpen(Application app) { app.Write(); } } static void Main(string[] args) { //android 系统运行支付宝和微信 MobileSystem androidSystem = new Android(); androidSystem.TaskOpen(new Alipay()); androidSystem.TaskOpen(new Weixin()); //Ios 系统运行支付宝和微信 MobileSystem iosSystem = new Ios(); iosSystem.TaskOpen(new Alipay()); iosSystem.TaskOpen(new Weixin()); Console.ReadKey(); }
运行结果如下:
四、总结
优点:
分离抽象接口及其实现部分。
桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现细节对客户透明,可以对用户隐藏实现细节。
使用场景:
当一个对象有多个变化因素时,可以考虑使用桥接模式,通过抽象这些变化因素,将依赖具体实现修改为依赖抽象。
如果使用继承的实现方案,会导致产生很多子类,任何一个变化因素都需要产生多个类来完成,就要考虑桥接模式。
当我们期望一个对象的多个变化因素可以动态变化,而且不影响客户端的程序使用时。
示例代码下载:
https://yunpan.cn/cYDk6q4xcuDbK (提取码:2610)