一、前言

现在用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. 通过代码实现gz压缩,并保持原来的文件名

    写这篇博客主要是为了记录一下这两天来的研究成果-gz带原有文件名压缩.首先要说的是这个解决方案不是通过调用命令gzip来做的,而是通过java代码来实现的,其中用到了apache的common com ...

  2. Java小方法

    /** * 计算百分比. * @param dividend 被除数 * @param divisor 除数 * @return 结果 */ private String getPercent(lon ...

  3. 50个jquery代码片段(转)

    本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助 ...

  4. 如何使用emacs编写c语言程序,并编译运行

    vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...

  5. javascript之url转义escape()、encodeURI()和encodeURIComponent()

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  6. [转][ASP.NET MVC 小牛之路]12 - Section、Partial View 和 Child Action

    本文转自:http://www.cnblogs.com/willick/p/3410855.html 概括的讲,View中的内容可以分为静态和动态两部分.静态内容一般是html元素,而动态内容指的是在 ...

  7. 计算机中的颜色XIV——快速变换颜色的V分量

    基本知识回顾: 计算机中的颜色Color,用RGB模式存储(用R.G.B三个分量表示颜色,每个分量的范围是0—255). 而计算机中的颜色除了用RGB模式表示以外,常见的还有HSV模式(或者是HSB. ...

  8. 【iOS 初见】第一个简单的 iOS 应用

    本实例来自 <iOS编程(第4版)>,介绍如何编写一个简单的 iOS 应用. 功能为:在视图中显示一个问题,用户点击视图下方的按钮,可以显示相应的答案,用户点击上方的按钮,则会显示一个新的 ...

  9. C语言异或运算在程序设计中的妙用

    异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0. 性质: (1).与1异或会翻转 (2).与0异或保持不变 ...

  10. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...