• 桥接模式


    桥接模式的意图,与适配器很相似

    适配器,将原有的接口转换成另一种接口,不改变原有接口,达到不同的接口适配

    桥接模式,在变化的点之间,架起一种桥,使得可以很方便的与不同的点进行统一的通信

    比如:游戏安装在不同的机器上,游戏的低层接口都是统一的,针对于不同的平台

    低层的实现方式不一样,只需要保证游戏在不同的机器上可以实现同样的效果

    继承会带来的麻烦?

    对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现

    子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现的任何变化都会导致子类发生变化,当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依懒关系限制了灵活性并最终限制了复用性

    合成/聚合复用原则

    尽量使用合成聚合,尽量不要使用类继承

    聚合表示一种弱的拥有关系

    合成表示一种强的拥有关系,体现了严格的部分和整体的关系

    合成/聚合复用原则的好处

    优先使用对象的合成聚合将有助于保持每个类被封装,并被集中在单个任务上

    这样类类继承层层次会保持较小的规模,并且不大可能增长为不可控制的庞然大物

    桥接的结构图

     

    桥接模式要注意的点:

    以下为示例代码

    /// <summary>
        /// 通过这个类将refiendabstraction与concreteImplementorB或者C关联起来
        /// </summary>
        class Abstraction
        {
            protected Implementor Implementor;
    
            public void SetImplementor(Implementor implementor)
            {
                this.Implementor = implementor;
            }
    
            public virtual void Operation()
            {
                Implementor.Operation();
            }
        }
     class RefiendAbstraction:Abstraction
        {
            public override void Operation()
            {
                Implementor.Operation();
            }
        }
     abstract  class Implementor
      {
          public abstract void Operation();
      }
    class ConcreteImplementorA:Implementor
        {
            public override void Operation()
            {
                Console.WriteLine("ConcreteImplementorA的实现方式");
            }
        }
    class ConcreteImplementorB:Implementor
        {
            public override void Operation()
            {
                Console.WriteLine("ConcreteImplementorB的实现方式");
            }
        }
    static void Main(string[] args)
            {
                Abstraction abstraction=new RefiendAbstraction();
                abstraction.SetImplementor(new ConcreteImplementorA());
                abstraction.Operation();
                abstraction.SetImplementor(new ConcreteImplementorB());
                abstraction.Operation();
                Console.ReadLine();
            }
  • 相关阅读:
    PHP+Ajax手机移动端发红包实例
    PHP+Ajax点击加载更多列表数据实例
    Thinkphp带表情的评论回复实例
    PHP+Mysql查询上一篇和下一篇文章实例
    PHP通过session判断防止表单重复提交实例
    PHP+Ajax微信手机端九宫格抽奖实例
    PHP+Ajax+plupload无刷新上传头像代码
    PHP原生开发的各大音乐平台API接口
    js 获取浏览器高度和宽度值(多浏览器)(转)
    NPOI、MyXls、Aspose.Cells 导入导出Excel(转)
  • 原文地址:https://www.cnblogs.com/gdnyfcuso/p/6702181.html
Copyright © 2020-2023  润新知