一、前言

现在用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)

移动APP为什么要开发两套Android和IOS-桥接模式的更多相关文章

  1. 总结使人进步,可视化界面GUI应用开发总结:Android、iOS、Web、Swing、Windows开发等

    可视化界面的软件,是21世纪最主流的应用类型了,黑屏控制台的不适合普通用户.   2004年左右的时候,作为普通网民,接触的自然是可视化,准确是Windows那一套.   那个时候,Microsoft ...

  2. cocos2d-x系列 Mac下配置cocos2d-x开发环境(android和ios)

    一.下载cocos2d-x http://cocos2d-x.org/projects/cocos2d-x/wiki/Download cocos2d-x-2.1.4.zip @ June.18, 2 ...

  3. Mac下配置cocos2d-x开发环境(android和ios)

    一.下载cocos2d-x http://cocos2d-x.org/projects/cocos2d-x/wiki/Download cocos2d-x-2.1.4.zip @ June.18, 2 ...

  4. JAVA开发的23种设计模式之 --- 桥接模式

    桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多 ...

  5. 谈谈App的混合开发

    一.概念 App混合开发,顾名思义,是一个开发模式,指的是开发一个App一部分功能用native构建一部分功能用html5构建,英文名叫:Hybrid App. 在几年前就已经出现了App混合开发模式 ...

  6. MAUI与Blazor共享一套UI,媲美Flutter,实现Windows、macOS、Android、iOS、Web通用UI

    1. 前言 距离上次发<MAUI初体验:爽>一文已经过去2个月了,本计划是下半年或者明年再研究MAUI的,现在计划提前啦,因为我觉得MAUI Blazor挺有意思的:在Android.iO ...

  7. Web项目也能一键打包Android、IOS

    随着移动互联网的不断发展,智能手机配置的不断提高,越来越多的年轻人基本都在使用手机,如微信.支付宝等等.已基本成为一种习惯,坐电梯也好.吃饭也好.开车也好,基本都捧着一个手机在那按来按去,开车就不建议 ...

  8. 提高Android和iOS调试编译速度

    http://www.cnblogs.com/findumars/p/7841252.html 提高Android和iOS调试编译速度   如果您使用Delphi开发App,就会遇到:Android和 ...

  9. Appium - Android 对照 iOS

    Appium - Android 对照 iOS 作者: Max.Bai 时间: 2014/10 Appium - Android 对照 iOS Appium 支持Android也支持iOS.可是两者还 ...

随机推荐

  1. Effective Java 01 Consider static factory methods instead of constructors

    Advantage Unlike constructors, they have names. (BigInteger.probablePrime vs BigInteger(int, int, Ra ...

  2. Linux之存储及文件系统管理

    一.存储管理 1.各种存储设备在Linux系统中对应的文件名 2.硬盘结构及分区 1).硬盘结构 2) .为什么要进行硬盘分区: a) 更容易管理和控制系统,因为相关的文件和目录都放在一个分区中. b ...

  3. js 操作select和option

    js 操作select和option 1.动态创建select function createSelect(){ var mySelect = document.createElement_x(&qu ...

  4. Rotate Array

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  5. Hive get table rows count batch

    项目中需要比对两种方法计算生成的数据情况,需要做两件事情,比对生成的中间表的行数是否相同,比对最后一张表的数据是否一致. 在获取表的数据量是一条一条地使用select count(*) from ta ...

  6. CentOS7.2安装总结

    第一次自己写文章,想想还有点小激动呢.折腾了大半天,终于在一个没用的台式机上面装了个mini版的CentOS7.2.写这篇文章也是做个记载,要是以后再装要注意了. 一.安装过程 采用U盘安装.最初是准 ...

  7. UESTC 886 方老师金币堆 --合并石子DP

    环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...

  8. BZOJ 2186 [Sdoi2008]沙拉公主的困惑 【逆元】

    题意:求中互质的数的个数,其中. 分析:因为,所以,我们很容易知道如下结论    对于两个正整数和,如果是的倍数,那么中与互素的数的个数为      本结论是很好证明的,因为中与互素的个数为,又知道, ...

  9. string 类的实现

    . #include<iostream> . #include<iomanip> . using namespace std; . . class String{ . frie ...

  10. js中容易被忽视的事件问题总结

    一:跨平台事件 什么叫跨平台事件?即在不同的浏览器上执行同一事件,所使用的方法不同. 什么是EventUtil对象?有什么作用?即将所有与事件相关的函数,融合在一起的一个容器,方便管理事件对象,它没有 ...