zoukankan      html  css  js  c++  java
  • 移动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)

  • 相关阅读:
    一步完成 MySQL 向 Redis 迁移
    php7性能、兼容性和稳定性探讨
    【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合
    Nginx的Rewrite正则表达式,匹配非某单词
    ajax下载,前端js下载(转)
    根据马甲、应用商店、统计每天的注册量,要求可以根据选择马甲和app,马甲和appstrore和user_login不同表问题
    别名的使用注意,""真坑。
    策略模式Strategy
    关于poi操作excel我使用的一些修饰操作
    java的代理(编程思想)
  • 原文地址:https://www.cnblogs.com/yinrq/p/5301926.html
Copyright © 2011-2022 走看看