前言
在我们日常的Android开发中,一个 APP 通常是有 class(类)和interface(接口)组成,而这些 class 与 和interface 之间如何组合、相互之间如何发生作用,则是影响这个 APP 本身的关键点。
也许我们了解了很多编程思想:面向过程编程OPP(Procedure Oriented Programming)、面向对象编程OOP(Object Oriented Programming)、面向切面编程AOP(Aspect Oriented Programming),除此之外应该还听过面向接口编程,而此“接口”并非interface,而是一种更抽象的思想层面的用于实现多态性、提高软件灵活性和可维护性的架构部件。从这个意义上说,abstract class和interface均可被认为“接口”,换言之也就是面向抽象编程。
它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。
接口和抽象类
接口和抽象类的理解
-
接口是在一定粒度视图上同类事物的抽象表示,它规定了实现本接口的类或接口必须拥有这些抽象能力。体现了“如果你是……则必须能……”的理念。例如,人都要吃饭,即“如果你是人,则必须要吃饭”。那么模拟到计算机程序中,就应该有一个IPerson接口,并有一个方法叫eat(),然后我们规定,每一个表示“人”的类,必须实现IPerson接口,这就模拟了“如果你是人,则必须要吃饭”这条规则。
在面向对象的思想中类是客观事物的抽象,而抽象类又是类的进一步抽象。
-
抽象类是用来捕捉子类的通用特性的,包括属性及行为。比如猪能吃能睡,但猪不会飞,假设有一天有些猪进化到直接/间接会飞了,我们就可以通过接口对飞的行为进行抽象,有哪些品种的猪需要飞直接实现该接口即可。更近一步说如果有一天所有猪都会飞了,那就成了通用特性了,就可以把该行为归属到抽象类中了
接口和抽象类的区别
抽象类是对类本质的抽象,表达的是 is a 的关系,比如:奔驰是车。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现。
而接口是对行为的抽象,表达的是 like a 的关系。比如:小鹏飞行汽车像飞行器一样可以飞,但其本质上也是个车。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、是如何实现的,接口并不关心。
面向接口编程
通过上述对接口和抽象类的讲解,大家应该对它们有所了解了,那么什么是面向接口编程呢?
定义:
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
优点:
- 易于对代码架构的解耦和扩展
- 替换接口实现时,替换成本比较小
- 在日常开发中开发人员可以并行开发,不依赖其他同学的实现进行开发,只要提供接口即可,提高开发效率。
谈到解耦合,不得不说以下两种设计模式,策略模式与状态模式。
面向接口编程在业务中的应用:
策略模式
天生适合业务,同一模块不同类型业务,如果行为相同,或许就可以考虑使用策略模式去解耦了。
什么是策略模式呢?
策略模式:接口+实现类+策略分发
策略模式根据外界条件来选取不同的策略。
策略讲究的是做一件事情可以有不同的招数。if else 也是一种策略的一种实现方式。
状态模式
状态模式根据内部状态来决定不同的反应,每一种状态做不同的事情,不能互相替换。
兜底布局LoadLayout (加载中状态、失败状态、重试状态、加载成功状态)
这里不讲策略模式和状态模式的区别,了解下概念即可,如果不好理解,举个例子说明下:
网上购物时需要支持在线支付,可选择支付宝、微信、银联支付等方式就是不同的策略。 付完钱后订单处于待发货、待收件、待配送、待签收等状态,就可以理解成不同的状态。
思考与感悟
任何架构模式都没有最好、最优之说,只有最适合当前业务的才是好架构,业务决定架构,切忌过度设计。日常码代码的过程中在满足业务要求的时候基本上围绕两点展开:解耦和复用,当然也要注意提升代码可读性,你好他也好,当解耦和复用出现让你选择的时候,毫无疑问选择解耦。