如何理解面向对象编程(oop)和面向接口(interface)编程

原创
2018/09/26 18:26
阅读数 1K

一、面向对象的三要素

    1、继承

    2、封装    

    3、多态

       面向对象的三要素是一个老生常谈的话题了,至于他的具体定义我在本文中不在赘述。今天写这篇文章是想站在不同的角度去更好的理解,面向对象编程和面向接口编程。

        个人认为,面向对象编程是站在事物对象的角度来谈论这个话题的(这的对象不是指具体的某一个类的实例,而是说组成世界的事务,就是一个一个的对象)。在系统的构建过程中,组成生态系统的对象包括森林、山川、湖泊、海洋等等。而在这些大的对象中例如森林本身就是一个更小的生态系统,这和程序设计中的微服务概念是完全相同的。

        组成世界的系统尚且如此,程序架构中也是参考了现实世界中的实现。面向对象和微服务实质上都是对代码的封装,不同的是层面上的不同。面向对象编程更倾向于程序功能的实现上,而微服务更倾向于系统架构的层面。无论是微服务还是面向对象编程,总之都是希望,代码更加利于维护和更加健壮。

        而个人认为,面向接口编程则是站在了程序实现过程中,需要依赖某个对象时的抽象过程。比如:你人生中需要找一个男朋友,但是在茫茫人海里,你并不知道具体是谁。所以你可以事先规划你的人生,预留一个男人的接口就可以了。具体到时候谁和你结婚生子,你可以先不用关心。也许这个例子并不是很贴切,我们换一个例子,比如:你要吃肉,然后你就出钱给猎人去打猎。猎人去山里,打到猪你就吃猪,打到狗你就吃狗。对于你来说你只是关心吃肉,但是不同的猎人去打猎,你就具备了不同的能力(吃猪肉和吃狗肉)。好了闲话不多扯,我们来看下嘛的代码实现

二、代码实现

    1、先定义一个接口代表你自己,提供一个吃的能力

public interface YourSelf{

    //代表你能吃肉
    String eat();
}

    2、定义一个A类(这里不定以为猎人类,因为不够形象)去实现YourSelf接口

public class A implements YourSelf{

    //实现YourSelf类的eat方法
    public String eat(){
       return  "吃猪肉";
    }
}

    3、定义一个B类,去实现YourSelf接口

public class B implements YourSelf{

    //实现YourSelf类的eat方法
    public String eat(){
       return  "吃狗肉";
    }
}

        这样,不同的实现类,你就具备了不同的能力。本文不是要介绍面向对象的多态性,所以这里不做过多的赘述,以上代码也没有进行测试。今天我们要讲的是如何理解面向接口编程。

        现在,假设我们要实现你吃肉这么一个功能。那我们可以按一下的思路来实现。

            (1) 有一个你自己的对象(俗称调用类)

            (2) 要有一个吃肉的行为(俗称方法)

            (3) 你自己要具备吃肉这个行为(俗称 调用类要能够执行该方法)

        下面我们来看代码实现,

        


private YourSelf yourSelf;

//实现你吃肉
public static void mian(String[] args){
    //1,首先由你自己(可以采用spring注入,但是spring注入需要有实现类,而我们现在就是不知道实现类是谁啊)
       yourSelf (你自己有了)
     
    //2,用你自己去做吃这种行为(用你自己去掉 吃的方法)
       eat(吃的方法也在接口里面了)

    
    //3,我不管了,反正我要吃肉(面向接口编程的思想精髓就在于抛开一切,不管不顾,勇敢的去做自己想做的事情)
       yourSelf.eat();(虽然启动会报错,但是我非要这么写,我的功能完成了,我只写接口不写实现类,实现类交给其他同事去写)
      
}

    

           面向接口编程的思想精髓就在于抛开一切具体实现过程,不管不顾只提供最抽象的逻辑。这就像领导和说这个系统要实现什么什么功能一样,你也可以站在领导的角度,用对象的角度来封装这些功能(这里的对象不光是指某个类的实例,也可以是某个子系统或某个模块,如支付系统,邮件系统、登录模块等等,一定要把控好对对象划分的粒度)。要想真正体会什么是面向接口编程,首先要选择好看待问题的角度和把控好对象划分的细粒度

          如果你不站在具体实现的细节不管不问,你也就很难去理解面向接口编程了。这和生活中的管理层管理的道理是不谋而合的,就好比一个董事长,他只关心公司重大问题的裁决上,公司有什么大事需要裁决。开个股东大会然后做个决定,完了。如果他非要关心公司里面某个员工上班都在做什么,完成了多少工作,有没有在偷懒。那他也不可能成为董事长。这和程序开发中一个接口或类中依赖了很多对象一样,到最后改都没办法改了。只能暗暗的心理骂一句那个同事写的代码真垃圾,然后自己也跟着同事做一些让这个代码变得更烂的行为。

     4、具体去实现某个接口

         我们说,站在对细节不管不问的角度更能够理解面向接口编程,其实就是对代码的一种抽象。也有的书会把面向对象的三大特性改为四大特性,多加了抽象这么一个概念。其实抽象的目的就是为了减少代码之间的依赖,注意,是代码之间的依赖而不是类或者对象之间的依赖。因为代码也包括了类、对象、的概念,同时也包括子系统,模块,微服务等之间的依赖了。

         当然,在系统开发设计过程中,我们可以切换角色,站在不同的角度来看问题,从而设计出更加合理的系统来。但是在编程中,我们还是逃不过具体实现这个角色。根据很多优秀的开源框架如:spring 的源码过程中也给了我们很多启示,我们可以定义一个默认的一个实现类,去实现该接口的某一种实现功能,这样启动的时候就不会报错了。当我们需要另外一种实现方式去实现该接口时,我们可以换一个类去实现接口。调用方就不用依赖于具体的实现类了,你根本不用关心是哪个类去实现的,你就调就完了。

     好了,今天的面向对象编程和面向接口编程就和大家扯到这里了,本观点纯属个人拙见。

        

    

    

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部