java中接口的编程理解

转载至:http://www.cnblogs.com/LearningC/p/3629140.html

 

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

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

情景:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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" );
      }
    }
}

  调用:

1
2
3
4
Door dr =  new  Door();
dr.Connect();
dr.SendCommand();
dr.DisConnect();

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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" );
      }
    }
 
}

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

1
2
3
4
Door dr =  new   Door();
dr.ConnectByCom();
dr.SendCommandByCom();
dr.DisConnectByCom();

  

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

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

这里是连接接口:

1
2
3
4
5
interface  IConnect
{
        void  Connect();
        void  DisConnect();  
}

这里是通讯接口:

1
2
3
4
interface  ISendCommand
{
        void  SendCommand();     
}

这里是我们的门禁接口:

1
2
3
4
interface  IDoor:IConnect,ISendCommand
{
        
}

这里是门禁的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Class Door:IDoor
{
    public  void  Connect()
     {
        //Socket通讯
    
 
    public  void  DisConnected()
    {
          //Socket通讯
    }
 
    public  void  SendCommand( bool  OptOptions)
    {     
     //Socket通讯
    }
}

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

1
2
3
4
IDoor dr =  new  Door();
dr.Connect();
dr.SendCommand();
dr.DisConnect();

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Class NewDoor:IDoor
{
    public  void  Connect()
     {
        //COM通讯
    
 
    public  void  DisConnected()
    {
          //COM通讯
    }
 
    public  void  SendCommand( bool  OptOptions)
    {     
     //COM通讯
    }
}

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

1
2
3
4
5
6
7
8
9
10
//旧设备
IDoor dr =  new  Door();
dr.Connect();
dr.SendCommand();
dr.DisConnect();
//新设备
IDoor ndr =  new  NewDoor();
ndr.Connect();
ndr.SendCommand();
ndr.DisConnect();

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

 

 

针对面向实接口实现编程:

interface Tire {publicvoid roll(); } class Bridgestone implements Tire {publicvoid roll() { System.out.print("Bridgestone is rolling."); } } class Michelin implements Tire {publicvoid roll() { System.out.print("Michelin is rolling"); } }

接口Tire定义了“转动”这个接口,但把实现延迟到了子类中

classCar { public void roll(Tire tire) { tire.roll(); } } Car car = new Car(); BridgeStone tire1 = new Bridgestone(); Michelin tire2 = new Mechilin(); car.roll(tire1); car.roll(tire2);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值