zoukankan      html  css  js  c++  java
  • 设计模式のBridgePattern(桥接模式)----结构模式

    一、产生背景

      这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控器都继承这个抽象类,具体设计类图如下:

    这样的实现使得每部不同型号的电视都有自己遥控器实现,这样的设计对于电视机的改变可以很好地应对,只需要添加一个派生类就搞定了,但随着时间的推移,用户需要改变遥控器的功能,如:用户可能后面需要对遥控器添加返回上一个台等功能时,此时上面的设计就需要修改抽象类RemoteControl的提供的接口了,此时可能只需要向抽象类中添加一个方法就可以解决了,但是这样带来的问题是我们改变了抽象的实现,如果用户需要同时改变电视机品型号和遥控器功能时,上面的设计就会导致相当大的修改,显然这样的设计并不是好的设计。然而使用桥接模式可以很好地解决这个问题,下面让我具体看看桥接模式是如何实现的。

    意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

    主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

    何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

    如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

    二、实现方式

    把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

    三、实例

    抽象化部分的代码:

     
     /// <summary>
        /// 抽象概念中的遥控器,扮演抽象化角色
        /// </summary>
        public class RemoteControl
        {
            // 字段
            private TV implementor;
    
            // 属性
            public TV Implementor
            {
                get { return implementor; }
                set { implementor = value; }
            }
    
            /// <summary>
            /// 开电视机,这里抽象类中不再提供实现了,而是调用实现类中的实现
            /// </summary>
            public virtual void On()
            {
                implementor.On();
            }
    
            /// <summary>
            /// 关电视机
            /// </summary>
            public virtual void Off()
            {
                implementor.Off();
            }
    
            /// <summary>
            /// 换频道
            /// </summary>
            public virtual void SetChannel()
            {
                implementor.tuneChannel();
            }
        }
    
        /// <summary>
        /// 具体遥控器
        /// </summary>
        public class ConcreteRemote : RemoteControl
        {
            public override void SetChannel()
            {
                Console.WriteLine("---------------------");
                base.SetChannel();
                Console.WriteLine("---------------------");
            }
        }

    遥控器的实现方法部分代码,即实现化部分代码,此时我们用另外一个抽象类TV封装了遥控器功能的变化,具体实现交给具体型号电视机去完成:

     /// <summary>
        /// 电视机,提供抽象方法
        /// </summary>
        public abstract class TV
        {
            public abstract void On();
            public abstract void Off();
            public abstract void tuneChannel();
        }
    
        /// <summary>
        /// 长虹牌电视机,重写基类的抽象方法
        /// 提供具体的实现
        /// </summary>
        public class ChangHong : TV
        {
            public override void On()
            {
                Console.WriteLine("长虹牌电视机已经打开了");
            }
    
            public override void Off()
            {
                Console.WriteLine("长虹牌电视机已经关掉了");
            }
    
            public override void tuneChannel()
            {
                Console.WriteLine("长虹牌电视机换频道");
            }
        }
    
        /// <summary>
        /// 三星牌电视机,重写基类的抽象方法
        /// </summary>
        public class Samsung : TV
        {
            public override void On()
            {
                Console.WriteLine("三星牌电视机已经打开了");
            }
    
            public override void Off()
            {
                Console.WriteLine("三星牌电视机已经关掉了");
            }
    
            public override void tuneChannel()
            {
                Console.WriteLine("三星牌电视机换频道");
            }
        }

    采用桥接模式的客户端调用代码:

     /// <summary>
        /// 以电视机遥控器的例子来演示桥接模式
        /// </summary>
        class Client
        {
            static void Main(string[] args)
            {
                // 创建一个遥控器
                RemoteControl remoteControl = new ConcreteRemote();
                // 长虹电视机
                remoteControl.Implementor = new ChangHong();
                remoteControl.On();
                remoteControl.SetChannel();
                remoteControl.Off();
                Console.WriteLine();
    
                // 三星牌电视机
                remoteControl.Implementor = new Samsung();
                remoteControl.On();
                remoteControl.SetChannel();
                remoteControl.Off();
                Console.Read();
            }
        }

    四、设计模式分析

    优点:   1、抽象和实现的分离。

        2、优秀的扩展能力。

        3、实现细节对客户透明。

    缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

    点击下载源码

  • 相关阅读:
    搭建nexus私服(maven)
    maven配置本地仓库(从本地仓库下载jar包到.m2仓库)
    关于引入多个jquery冲突的问题(附一个很好用的validate前端验证框架及使用方法)
    java excel导出
    Eclipse+Maven创建webapp项目 及部署在tomcat上
    solr添加IK分词和自己定义词库
    将Mysq数据导入solr索引库
    solr +zookeeper+Jetty 集群搭建
    solr +zookeeper+tomcat 集群搭建
    如何用Maven创建web项目(具体步骤)转载
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/8136995.html
Copyright © 2011-2022 走看看