纯使用对象的方式
传统的面向对象编程大多是通过创建各类对象实现业务功能,然而当需求发生变化时,业务层的对象可能各种重构,牵一发而动全身。
招聘程序员
公司需要招聘程序员这个岗位的人员,对于面向对象的程序设计来说,一般会设计一个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),她直接问一句:“是不是只要会写代码的人都行?”这是一句点醒我们的话,其实对招聘程序这项业务来说,不需要关心这个人的职务,而只要知道这个人会不会写代码就行了!
面向接口设计
一语点醒梦中人,赶紧想办法解决,这时候就要引入接口编程。也就是先定好业务方对接的接口,至于其他的业务并不关系。对于程序员招聘这个业务,其实只需要两个条件:
- 是一个人
- 会写代码
而第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);
}
}













网友评论