设计模式二十四讲之《桥接模式》

定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。既实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。抽象与它的实现分离,并不是让抽象类与其派生类分离,实现
指的是抽象类和它的派生类用来实现自己的对象。

优势:在继承体系中有多个方向变化时,可以解耦这些不同的方向变化。具体的理解为,例如下面带例子的桥接模式:手机品牌这个抽象父类就是一个桥,用于链接不同品牌下手机软件的适应变化。

适用:1.具体的功能实现需要被独立出来,让它们各自变化,且每种实现的变化不会影响其他实现的但又要有统一管理的情况;
2.不希望在抽象与实现部分之间有固定的绑定关系;
3.类的抽象以及它的实现都应该通过生成子类的方式加以扩充。这时桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们实现;
4.对抽象的实现部分进行修改应对客户不产生影响,即客户的代码不必重新编译;
5.相对客户完全隐藏抽象的实现部分;
6.现在多个对象间共享实现,但同时要求客户并不知道这点。游戏中适用的场景例如不同门派、角色与武器之间的调用关系。

特点:1.分离接口及其实现部分,一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现;
2.将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译Abstraction类和Client类。为了保证一个类库的不同版本之间的兼容,需要有这个特性;
3.接口和实现分离有助于分层,从而产生更好的结构化系统。系统的高层不封仅需要知道Abstraction和Implementor即可;
4.提高可扩充性,可以独立的对Abstraction与Implementor层次结构进行扩充;
5.实现细节对Client透明。可以对Client隐藏实现细节,如共享Implementor对象以及相应的应用计数机制。


 class Program
    {
        static void Main(string[] args)
        {
            //Abstraction ab = new RefinedAbstraction();                   //没有例子的桥接模式            //执行步骤:1.将继承于Abstraction的对象RefinedAbstraction实例化给ab;
            //ab.SetImplementor(new ConcreteImplementorA());                                               //          2.在ab中调用RefinedAbstraction中类的SetImplementor方法,将ConcreteImplementorA传递到该类中的implementor上;
            //ab.Operation();                                                                              //          3.在ab中调用RefinedAbstraction中类的Operation方法,由于该方法中的implementor变为了ConcreteImplementorA,故
            //ab.SetImplementor(new ConcreteImplementorB());                                               //            执行的是ConcreteImplementorA中的Operation方法,然后得到ConcreteImplementorA中Operation方法显示的结果;
            //ab.Operation();                                                                              //          4.重复2、3步骤得到ConcreteImplementorB中Operation方法显示的结果;
            //Console.Read();

            HandsetBrand hb;
            hb = new HandsetBrandN();                                    //带例子的桥接模式               //执行步骤:基本和上面的一样,这里就不赘述了!
            hb.SetHandsetSoft(new HandsetAddressList());                                                                                                               
            hb.Run();                                                                                     //总结起来就是:利用抽象父类中HandsetBrand的SetHandsetSoft方法将外部引入的值(例如“new HandsetAddressList()”)附到本类,
            hb.SetHandsetSoft(new HandsetGame());                                                         //              然后利用本类中调用的Run方法中本身就是调用HandsetSoft中的Run方法的过程实现一个桥接调用,原理不难,理清楚!
            hb.Run();
            hb = new HandsetbranM();
            hb.SetHandsetSoft(new HandsetGame());
            hb.Run();
            hb.SetHandsetSoft(new HandsetAddressList());
            hb.Run();

            Console.Read();

        }
    }

 class Abstraction
    {
        protected Implementor implementor;
        public void SetImplementor(Implementor implementor)
        {
            this.implementor = implementor;
        }
        public virtual void Operation()
        {
            implementor.Operation();
        }
    }
    class RefinedAbstraction:Abstraction
    {
        public override void Operation()
        {
            implementor.Operation();
        }
    }

abstract class Implementor
    {
        public abstract void Operation();
    }
    class ConcreteImplementorA : Implementor
    {
        public override void Operation()
        {
            Console.WriteLine("毛毛都的无聊生活的具体实现A的方法执行"); 
        }
    }
    class ConcreteImplementorB : Implementor
    {
        public override void Operation()
        {
            Console.WriteLine("毛毛都的无聊生活的具体实现B的方法执行");
        }
    }

  abstract  class HandsetBrand
    {
        protected HandsetSoft soft;
        public void SetHandsetSoft(HandsetSoft soft)
        {
            this.soft = soft;
        }
        abstract public void Run();       
    }

    class HandsetBrandN : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }
    class HandsetbranM : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

 abstract  class HandsetSoft
    {
        public abstract void Run();
    }

    class HandsetGame : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("Run handset game!");
        }
    }
    class HandsetAddressList : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("Run handset address list!");
        }
    }

转载请注明出处!!!

欢迎加入951815219群聊,共享知识,讨论交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值