美文网首页Android开发
快速理解面向接口编程

快速理解面向接口编程

作者: 岛上码农 | 来源:发表于2020-05-16 23:31 被阅读0次

纯使用对象的方式

传统的面向对象编程大多是通过创建各类对象实现业务功能,然而当需求发生变化时,业务层的对象可能各种重构,牵一发而动全身。

招聘程序员

公司需要招聘程序员这个岗位的人员,对于面向对象的程序设计来说,一般会设计一个Person人员基类,然后再设计一个Programmer程序员子类继承Person,此时程序员与普通人相比多了一项技能,即写代码(writeCode)。类关系如下图所示:


1.png

产品经理来抢程序员饭碗

此时的业务比较简单,公司人事按这个要求招聘没问题。直到有一天,收到了一份简历,简历上看到这个人的职位是产品经理,但是因为是程序员出身,也来应聘程序员这个岗位。人事MM就犯难了,这个人到底符不符合要求?这时候因为增加了一个产品经理,一般我们印象中产品经理是不写代码的,但是会做产品设计(designProduct),我们的类图扩展为:


2.png

现在这个产品经理比较特殊,他会写代码,于是设计上我们要不更改ProductManager这个类,增加writeCode方法,但是这种实现不合理因为大部分产品经理不会写代码。于是,再扩展一个子类,能写代码的产品经理,现在类图变成这样了。


3.png
这时候告诉人事MM说,以后你简历看到会代码的产品经理都可以招,人事MM根据简历上的信息调用不同的方法即可,看似完美地解决了问题。然后,人事MM又拿看一份新简历来了,这回是个设计师,居然也会写代码(这年头人人都在学写代码)!!!好吧,我们再次扩展一下我们的类图,增加了UIDesigner(UI设计师)和UIDesignerAndProgrammer(会写代码的设计师)。

设计师也来抢程序员饭碗

4.png
现在这个类图已经很错乱了,如此再来一个别的会写代码的,我们的代码估计都没眼看了,最后因为招个程序员我们可能要增加十几个类。到最后人事MM要根据不同的简历去十多个方法找这个人是否满足招聘需要。最终,人事MM发现需要的这个岗位都有一个技能,就是写代码(writeCode),她直接问一句:“是不是只要会写代码的人都行?”这是一句点醒我们的话,其实对招聘程序这项业务来说,不需要关心这个人的职务,而只要知道这个人会不会写代码就行了!

面向接口设计

一语点醒梦中人,赶紧想办法解决,这时候就要引入接口编程。也就是先定好业务方对接的接口,至于其他的业务并不关系。对于程序员招聘这个业务,其实只需要两个条件:

  1. 是一个人
  2. 会写代码

而第2点就是业务方要的接口(ProgrammerService),只要这个人会写代码就能够胜任这个岗位,而不需要关心这个人的岗位信息。现在来重新设计一下我们的类图。


5.png

此时会发现招聘程序员ProgrammerJob这项业务已经和Programmer完全解耦了,这时候来什么会写代码的产品经理和设计师都一样,只要他们会写代码就行,来个完整的类图。


6.png
此时不管来多少会写代码的人群,对于招聘业务都一样,只需要会写代码就行。而且,哪天业务发生变更,比如招聘一个会销售的程序员(SalesAndProgrammer)的时候,ProgrammerJob只需要把ProgrammerService对应的实现类换成SalesAndProgrammer即可。贴一份Java示例代码:
package com.lios;

/**
 * Person基类
 */
public class Person {
    String name;
    String gender;
    int age;
}

/**
 * 会写代码的抽象接口
 */
public interface ProgrammerService {
    /**
     * 程序员会写代码
     */
    public void writeCode();
}

/**
 * 正儿八经的程序员
 */
public class ProgrammerImpl extends Person implements ProgrammerService{

    @Override
    public void writeCode() {
        System.out.println("我是程序员,我会写代码!");
    }
}

/**
 * 来抢程序员饭碗的产品经理
 */
public class ProductManagerAndProgrammerImpl extends Person implements ProgrammerService {
    @Override
    public void writeCode() {
        System.out.println("我是产品经理,我还会写代码!");
    }

    public void designProduct() {
        System.out.println("我是产品经理,我会设计产品!");
    }
}

/**
 * 招聘业务
 */
public class ProgrammerJob {
    void needProgrammer(ProgrammerService programmer) {
        programmer.writeCode();
    }

    public static void main(String[] args) {
        ProgrammerJob job = new ProgrammerJob();
        //来了一个程序员
        ProgrammerImpl programmer = new ProgrammerImpl();
        //人事MM可以用needProgrammer处理
        job.needProgrammer(programmer);
        //来了一个会写代码的产品经理
        ProductManagerAndProgrammerImpl productManagerAndProgrammer = new ProductManagerAndProgrammerImpl();
        //人事MM还是可以用needProgrammer处理
        job.needProgrammer(productManagerAndProgrammer);
    }
}

相关文章

  • 快速理解面向接口编程

    纯使用对象的方式 传统的面向对象编程大多是通过创建各类对象实现业务功能,然而当需求发生变化时,业务层的对象可能各种...

  • 《Oracle Java SE编程指南》15-05:面向接口编程

    内容导航: 前言 1、接口的作用 2、面向接口编程 前言 接口的核心作用是面向接口编程。 面向接口编程 是一个非常...

  • Android 面向接口编程

    关键词:Android、POP、面向接口编程 、面向过程、面向协议 一、概述 面向接口编程是面向对象编程的一种实...

  • Android 网络框架--Retrofit2 架构分析

    面向接口编程 面向接口编程,模块化编程的必备技能,其乃实现解耦,增强扩展性的重要手段。 面向接口编程具体指的是什么...

  • 面向指针编程(一)

    面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数编程(亦即函数...

  • 8、使用注解开发

    8.1:面向接口编程 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程 ...

  • iOS面向接口编程(面向protocol编程)

    iOS面向接口编程(面向protocol编程) 前言 面向接口编程已经是老生常谈了,但是最近在做项目重构中发现,团...

  • AOP(一)---什么是AOP

    要理解AOP我们先要理解其他一些概念: 面向过程编程 面向对象编程 面向切面编程 面向过程编程OPP 面向过程的编...

  • 面向接口编程与策略模式

    面向接口编程 & 面向对象编程 Interface-based programming, also known a...

  • Java知识框架 - 架构概念

    SOAimage.png 微服务image.png 面向接口编程 面向函数编程

网友评论

    本文标题:快速理解面向接口编程

    本文链接:https://www.haomeiwen.com/subject/tnbdohtx.html