一、前言

 

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



运行结果如下:

iOS 桥接RN_移动开发

 

支付宝和微信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();
        }



运行结果如下:

iOS 桥接RN_设计模式_02

四、总结

 

优点:

分离抽象接口及其实现部分。

桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。

桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

实现细节对客户透明,可以对用户隐藏实现细节。

 

使用场景:

当一个对象有多个变化因素时,可以考虑使用桥接模式,通过抽象这些变化因素,将依赖具体实现修改为依赖抽象。

如果使用继承的实现方案,会导致产生很多子类,任何一个变化因素都需要产生多个类来完成,就要考虑桥接模式。

当我们期望一个对象的多个变化因素可以动态变化,而且不影响客户端的程序使用时。

 

示例代码下载:

https://yunpan.cn/cYDk6q4xcuDbK (提取码:2610)