zoukankan      html  css  js  c++  java
  • 对针对接口编程的理解

              针对接口编程。简简单单的六个字。说起来简单,想要做到这一步,需要花点时间和精力。

              下面,我讲通过自己做过的项目和经验来谈谈我的理解。如果有理解不对的地方,还请各位指正。

    情景:

             现在,有一个门禁需要驱动(这里的驱动指的是控制)。第一步:必须先建立连接;第二部:发送传输命令,让门磁打开,或是关闭。第三步:关闭连接。

             说到这里,我想起了我自己的开发经历。相当长的一段时间,我会这样做。(如下     

    Class Door
    {
       public void Connect()
        {
             Console.WriteLine("Connected the Door!");     
        }  
    
       public void DisConnected()
       {
             Console.WriteLine("DisConnected the Door!");
       }
    
       public void SendCommand(bool OptOptions)
       {
           //这里假设是用Socket来通讯的
             if(OptOptions)//Open
          {
            Console.WriteLine("Open the Door");
          }
           else
          {
            Console.WriteLine("Close the Door");
          }
       }
    }

      调用:

    Door dr = new Door();
    dr.Connect();
    dr.SendCommand();
    dr.DisConnect();

         后来,硬件工程师告诉我,设备升级了,他们不仅可以通过网络来传送命令。也可以通过COM口来传送命令,领导还说,这个必须和旧的设备兼容,需求的变动,永远是我们头疼的也是必须解决的问题。于是,我们这样改变。

    Class Door
    {
       //这里是原来的连接和断开方式,假设都是Socket通讯。
       public void Connect()
        {
             Console.WriteLine("Connected the Door!");     
        }  
    
       public void DisConnected()
       {
             Console.WriteLine("DisConnected the Door!");
       }
       //现在,需要重新写断开和连接。而方式步同。需要用COM
       
       ……
    
       //这里我们省略这一过程。因为这步是目的。
    
       public void SendCommand(bool OptOptions)
       {
           //这里假设是用Socket来通讯的
             if(OptOptions)//Open
          {
            Console.WriteLine("Open the Door");
          }
           else
          {
            Console.WriteLine("Close the Door");
          }
       }
    
       public void SendCommandbyCom(bool OptOptions)
       {
           //这里假设是用COM来通讯的
             if(OptOptions)//Open
          {
            Console.WriteLine("Open the Door");
          }
           else
          {
            Console.WriteLine("Close the Door");
          }
       }
    
    }

      我们需要该变原来的类,因为需要兼容原来的设备。当然,调用的地方也需要做相应的修改。因为我们需要区别到底是新设备还是旧设备。

    Door dr = new  Door();
    dr.ConnectByCom();
    dr.SendCommandByCom();
    dr.DisConnectByCom();
    

      

       我们发现,仅仅修改了一个设备的通讯方式,我们需要做出的改变是巨大的。如果我们针对接口编程,这里涉及到、单一职责原则里氏替换原则、依赖倒置原则

       这里,我会将门禁的连接、断开封装在一个接口中。将发送命令封装在另外一个接口中。   

    这里是连接接口:

    interface IConnect
    {
           void Connect();
           void DisConnect();   
    }
    

    这里是通讯接口:

    interface ISendCommand
    {
           void SendCommand();      
    }
    

    这里是我们的门禁接口:

    interface IDoor:IConnect,ISendCommand
    {
           
    }
    

    这里是门禁的实现:

    Class Door:IDoor
    {
       public void Connect()
        {
           //Socket通讯
        }  
    
       public void DisConnected()
       {
             //Socket通讯
       }
    
       public void SendCommand(bool OptOptions)
       {      
        //Socket通讯
       }
    }
    

      我们发现和最开始写的没什么不一样,但是,我们继续看下面的调用。

    IDoor dr = new Door();
    dr.Connect();
    dr.SendCommand();
    dr.DisConnect();
    

      发现,我们定义了一个IDoor 而不是Door ,我们却用的Door来实现。如果这个时候硬件工程师告诉我们。通讯方式变了。这个时候。我们只需要添加一个新的类叫NewDoor

    Class NewDoor:IDoor
    {
       public void Connect()
        {
           //COM通讯
        }  
    
       public void DisConnected()
       {
             //COM通讯
       }
    
       public void SendCommand(bool OptOptions)
       {      
        //COM通讯
       }
    }
    

      这个时候,我们调用的时候,只需要确定是新设备的时候,用NewDoor来实例化。而不是Door。

    //旧设备
    IDoor dr = new Door();
    dr.Connect();
    dr.SendCommand();
    dr.DisConnect();
    //新设备 
    IDoor ndr = new NewDoor();
    ndr.Connect();
    ndr.SendCommand();
    ndr.DisConnect();

     我们发现改动量小了很多,而且结构清晰,便于维护。项目组里面如果有人员变动,如果文档比较清晰的话,这些都是很好上手的。

      

  • 相关阅读:
    meanshift聚类的实现
    birch聚类算法
    DBSCAN聚类算法的实现
    discrete adaboost的C++实现
    kd-tree的实现
    红黑树的实现——插入
    24位位图转8位灰度图
    将RGB数据写入BMP位图文件
    splay树的实现
    AVL树的实现
  • 原文地址:https://www.cnblogs.com/LearningC/p/3629140.html
Copyright © 2011-2022 走看看