估计看到这个博文名字会有很些人懵逼,其实懵逼是正常的,因为刚听到这个名字我也是出于懵逼状态,也是看过类似的博文之后才有了那么点点的了解。

  一、面向接口的编程

    面向接口的编程目的是为了更好的代码扩展,因为对于java语言而言允许向上转型。

  二、面向对象的开发

    对于java世界而言,所有现实中的和非现实的事物一切都是可以抽象化的,万物皆对象。

  如何抽象化接口为java中的对象?

  接口包含了接口和抽象类,那么这里最终我们最关心的其实还是抽象方法。那么我们是否可以把方法看到一个对象?姑且可以,那么我们方法自身存在的那些属性?

    属性:方法名, 形参,返回值。

    行为:

      1、根据调用的方法执行某些行为(无形参,无返回值)

      2、根据调用的方法执行某些行为(有形参,无返回值)

      3、根据调用的方法执行某些行为(无形参,有返回值)

      3、根据调用的方法执行某些行为(有形参,有返回值)

  定义方法的抽象类(也可以接口)

 1 /**
 2  * 作者:liemng on 2017/11/15
 3  * 邮箱:859686819@qq.com
 4  */
 5
 6 public abstract class Function {
 7
 8     public String mFunctionName;
 9
10     public Function(String functionName){
11         this.mFunctionName = functionName;
12     }
13 }

  这里定义抽象类Function,并且定义一个传入方法名字的构造函数。

  接下来咱们按照上班的行为顺序定义如下Function的子类.

  FunctionNoParamsNoResult 无形参无返回值类,并且定义抽象方法invoke()

 1 /**
 2  * 作者:liemng on 2017/11/15
 3  * 邮箱:859686819@qq.com
 4  */
 5
 6 public abstract class FunctionNoParamsNoResult extends Function {
 7     public FunctionNoParamsNoResult(String functionName) {
 8         super(functionName);
 9     }
10
11     public abstract void invoke();
12 }

  FunctionWithParamsOnly 有形参无返回值类,并且定义抽象方法invoke(params) 由于参数类型是未知故而采用了泛型

 1 /**
 2  * 作者:liemng on 2017/11/15
 3  * 邮箱:859686819@qq.com
 4  */
 5
 6 public abstract class FunctionWithParamsOnly extends Function {
 7     public FunctionWithParamsOnly(String functionName) {
 8         super(functionName);
 9     }
10
11     public abstract <Params> void invoke(Params params);
12 }

  FunctionWithResultOnly  无形参有返回值类,并且定义了抽象方法invoke()

 1 /**
 2  * 作者:liemng on 2017/11/15
 3  * 邮箱:859686819@qq.com
 4  */
 5
 6 public abstract class FunctionWithResultOnly extends Function {
 7
 8     public FunctionWithResultOnly(String functionName) {
 9         super(functionName);
10     }
11
12     public abstract  <Result> Result invoke();
13 }

  FunctionWithParamsAndResult 有形参有返回值类,并且定义了抽象方法invoke(params) 由于参数类型是未知故而采用了泛型

 1 /**
 2  * 作者:liemng on 2017/11/15
 3  * 邮箱:859686819@qq.com
 4  */
 5
 6 public abstract class FunctionWithParamsAndResult extends Function {
 7     public FunctionWithParamsAndResult(String functionName) {
 8         super(functionName);
 9     }
10
11     public abstract  <Result, Params> Result invoke(Params params);
12 }

  到这里进步完成了对象的行为和属性的定义,对于属性由于是是未知的,故而直接使用了泛型。

  那么接下来就是如何去使用定义的方法类。这里我们添加如下管理类FunctionManager。

  根据上述的定义我们知道这里对于方法的行为我们这里定义了四种行为,那么我们这里简单的通过注解添加个约束。见代码

 1     public static final int TYPE_WITH_RESULT_ONLY = 0;
 2     public static final int TYPE_WITH_PARAMS_ONLY = 1;
 3     public static final int TYPE_NO_PARAMS_NO_RESULT = 2;
 4     public static final int TYPE_WITH_PARAMS_AND_RESULT = 3;
 5
 6
 7     /*由于方法行为仅仅存在四种,故而这里仅仅允许添加四种Action*/
 8     @IntDef({TYPE_WITH_RESULT_ONLY, TYPE_WITH_PARAMS_ONLY, TYPE_NO_PARAMS_NO_RESULT, TYPE_WITH_PARAMS_AND_RESULT})
 9     @Target(ElementType.PARAMETER)
10     @Retention(RetentionPolicy.SOURCE)
11     public @interface Type {
12     }

  这里我们看到注解类Type被注解@IntDef注解,这里说下@IntDef这里是约束警告元注解。这里拿方法的形参来简单讲解下该注解,该注解接受整形数据作为参数,并且被该元注解注解的注解用在方法的整形的形参上之后,这个形参对应的值必须是元注解中传入的任意一个值,否则就提示警告错误。这里我们用来约束方法的行为。

  根据对应的方法行为来存储对应的方法对象。

 1     private Map<Integer, List<? super Function>> mFuncMap;
 2
 3     /**
 4      * 根据特定的Type添加对应的Function
 5      * @param type
 6      * @param funcName
 7      * @param function
 8      */
 9     public void addFunc(@Type int type, @NonNull String funcName, @NonNull Function function) {
10         if (TextUtils.isEmpty(funcName) || null == function) {
11             return;
12         }
13         List<? super Function> funcWithResult = mFuncMap.get(type);
14         if (funcWithResult.contains(function))
15             return;
16         funcWithResult.add(function);
17     }

  第九行我们看到我们的注解Type约束了对应的形参,这里也就是我们的约束。mFuncMap是用于存储对应的行为的方法对象。

  这个方法最重要的目的是完成对应的方法对象的添加。

  接下是添加的方法如何被一一有效的调用执行。那么这里我们仅仅简单的看下对应的调用无形参无返回值的方法调用,其他的都基本类似,我们直接忽略。

  调用无形参无返回值。那么可以根据对应的方法名找到对应的方法对象,调用对应的invoke方法。如下见代码:

 1     /**
 2      * 调用无形参 无返回值的方法
 3      * @param funcName 方法名
 4      * @return
 5      */
 6     public void invokeFuncWithParamsAndResult(@NonNull String funcName) {
 7         /*filter invalid tag*/
 8         if (TextUtils.isEmpty(funcName))
 9             return;
10         List<? super Function> funcList = mFuncMap.get(TYPE_NO_PARAMS_NO_RESULT);
11
12         /*inner filter invalid tag*/
13         if (null == funcList || funcList.size() <= 0)
14             return;
15
16         FunctionNoParamsNoResult func;
17         for (Object obj : funcList) {
18             func = ((FunctionNoParamsNoResult) obj);
19             if (funcName.equals(func.mFunctionName)) {
20                 func.invoke();
21             }
22         }
23     }

  FunctionManager的完整代码如下:

/*** 作者:liemng on 2017/11/15* 邮箱:859686819@qq.com*/public class FunctionManager {public static final String TAG = Function.class.getSimpleName();public static final int TYPE_WITH_RESULT_ONLY = 0;public static final int TYPE_WITH_PARAMS_ONLY = 1;public static final int TYPE_NO_PARAMS_NO_RESULT = 2;public static final int TYPE_WITH_PARAMS_AND_RESULT = 3;/*由于方法行为仅仅存在四种,故而这里仅仅允许添加四种Action*/@IntDef({TYPE_WITH_RESULT_ONLY, TYPE_WITH_PARAMS_ONLY, TYPE_NO_PARAMS_NO_RESULT, TYPE_WITH_PARAMS_AND_RESULT})@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.SOURCE)public @interface Type {}private FunctionManager() {/*存储 需要返回值的Function*/List<? super Function> funcWithResult = new ArrayList<>();/*存储 仅仅包含形参*/List<? super Function> funcWithParams = new ArrayList<>();/*存储 无形参和返回值*/List<? super Function> funcNoParamsNoResult = new ArrayList<>();/*存储 拥有返回值和形参*/List<? super Function> funcWithParamsAndResult = new ArrayList<>();mFuncMap = new HashMap<>();mFuncMap.put(TYPE_WITH_PARAMS_ONLY, funcWithParams);mFuncMap.put(TYPE_WITH_RESULT_ONLY, funcWithResult);mFuncMap.put(TYPE_NO_PARAMS_NO_RESULT, funcNoParamsNoResult);mFuncMap.put(TYPE_WITH_PARAMS_AND_RESULT, funcWithParamsAndResult);}private static FunctionManager mFunctionManager;/*** 多线程安全单例** @return FunctionManager*/public static FunctionManager getInstance() {if (null == mFunctionManager) {synchronized (FunctionManager.class) {if (null == mFunctionManager) {mFunctionManager = new FunctionManager();}}}return mFunctionManager;}private Map<Integer, List<? super Function>> mFuncMap;/*** 根据特定的Type添加对应的Function* @param type* @param funcName* @param function*/public void addFunc(@Type int type, @NonNull String funcName, @NonNull Function function) {if (TextUtils.isEmpty(funcName) || null == function) {return;}List<? super Function> funcWithResult = mFuncMap.get(type);if (funcWithResult.contains(function))return;funcWithResult.add(function);}/*** 根据特定的Type移除对应的Function*  返回1:移除成功  0:失败  -1:无效* @param type* @param function*/public int removeFunc(@Type int type, @NonNull Function function){List<? super Function> funcWithResult = mFuncMap.get(type);if (funcWithResult.contains(function))return -1;return funcWithResult.remove(function) ? 1 : 0;}/*** 调用无形参 有返回值的方法* @param funcName 方法名* @param <Result> 返回值类型* @return*/public <Result> Result invokeFuncWithResult(@NonNull String funcName) {/*filter invalid tag*/if (TextUtils.isEmpty(funcName))return null;List<? super Function> funcList = mFuncMap.get(TYPE_WITH_RESULT_ONLY);/*inner filter invalid tag*/if (null == funcList || funcList.size() <= 0)return null;FunctionWithResultOnly func;for (Object obj : funcList) {func = ((FunctionWithResultOnly) obj);if (funcName.equals(func.mFunctionName)) {return (Result)func.invoke();}}return null;}/*** 调用有形参 有返回值的方法* @param funcName 方法名* @return*/public <Params, Result> Result invokeFuncWithParamsAndResult(@NonNull String funcName, Params params) {/*filter invalid tag*/if (TextUtils.isEmpty(funcName))return null;List<? super Function> funcList = mFuncMap.get(TYPE_WITH_PARAMS_AND_RESULT);/*inner filter invalid tag*/if (null == funcList || funcList.size() <= 0)return null;FunctionWithParamsAndResult func;for (Object obj : funcList) {func = ((FunctionWithParamsAndResult) obj);if (funcName.equals(func.mFunctionName)) {return (Result) func.invoke(params);}}return null;}/*** 调用有形参 无返回值的方法* @param funcName 方法名* @return*/public <Params> void invokeFuncWithParams(@NonNull String funcName, Params params) {/*filter invalid tag*/if (TextUtils.isEmpty(funcName))return;List<? super Function> funcList = mFuncMap.get(TYPE_WITH_PARAMS_ONLY);/*inner filter invalid tag*/if (null == funcList || funcList.size() <= 0)return;FunctionWithParamsOnly func;for (Object obj : funcList) {func = ((FunctionWithParamsOnly) obj);if (funcName.equals(func.mFunctionName)) {func.invoke(params);}}}/*** 调用无形参 无返回值的方法* @param funcName 方法名* @return*/public void invokeFuncWithParamsAndResult(@NonNull String funcName) {/*filter invalid tag*/if (TextUtils.isEmpty(funcName))return;List<? super Function> funcList = mFuncMap.get(TYPE_NO_PARAMS_NO_RESULT);/*inner filter invalid tag*/if (null == funcList || funcList.size() <= 0)return;FunctionNoParamsNoResult func;for (Object obj : funcList) {func = ((FunctionNoParamsNoResult) obj);if (funcName.equals(func.mFunctionName)) {func.invoke();}}}
}

转载于:https://www.cnblogs.com/liemng/p/7845267.html

面向接口的开发到面向对象的编程相关推荐

  1. 面向接口进行开发,而不是面向实现

    深入理解软件设计原则 第 7 篇 面向接口进行开发, 而不是面向实现: 依赖于抽象类 型, 而不是具体类. 如果无需修改已有代码就能轻松对类进行扩展, 那就可以说 这样的设计是灵活的.让我们再来看一个 ...

  2. php 面向接口,php开发app接口

    一.app接口简介:与PHP面向对象的接口不同,是通信接口地址 1.条件: 1)接口地址 2)接口文件 3)接口数据 2.如何通信 1)类似BS模式 3.客户端app通信格式区别:xml和json 1 ...

  3. 以一个通俗易懂的方式解释一下写程序为什么要声明接口和类,面向对象的编程思想,字数不多,主要通过代码理解

    首先我通过代码模仿了一下java中System.out.print函数,如何输出一个覆盖了toString()方法的类. 我先来解释一个为什么java程序要写接口interface. 比如我们有一个圆 ...

  4. YJ智能框架--面向对象方面编程

    中文摘要 摘要:面向对象编程作为主流编程范型,在Web系统设计实现中得到了很好的应用,但同时也早已暴露出不足,针对面向对象编程思想的不足人们提出了面向方 面编程.面向方面编程很好地解决了横切关注点的问 ...

  5. swift 组件化_打造完备的iOS组件化方案:如何面向接口进行模块解耦?

    作者 | 黑超熊猫zuik,一个修行中的 iOS 开发,喜欢搞点别人没搞过的东西,钻研过逆向工程.VIPER 架构和组件化. 关于组件化的探讨已经有不少了,在之前的文章 iOS VIPER架构实践(三 ...

  6. 面向过程中模拟出面向对象,用c语言模拟出MFC控件,消息循环,“设计用户界面”

    大家好,今天给大家分享"怎样用c模拟出MFC控件 简单模拟出消息循环,按钮控件",面向过程中模拟出面向对象. 编程思路 首先用绘图库EasyX绘制窗口,窗口中绘制按钮,把按钮对象化 ...

  7. 为什么有人说面向对象编程就是面向接口编程?

    "面向对象编程就是面向接口编程" 这句话相信, 很多人都在网上见过, 装b利器. 我一开始也是这么想的, 那些装b者丢下这一句, 就没下文了. 首先, 我认为这句话是1个假命题. ...

  8. C语言面向对象编程(四):面向接口编程

    Java 中有 interface 关键字,C++ 中有抽象类或纯虚类可以与 interface 比拟,C 语言中也可以实现类似的特性. 在面试 Java 程序员时我经常问的一个问题是:接口和抽象类有 ...

  9. 从面向对象编程转为面向接口编程

    大家写过C++或者Java,或者其他语言,基本上都会接触到面向对象这个概念. 面向对象,本身是软件编程发展过程中的产物,当然相比于面向过程,是一种突破性的设计.但是,如果只是停留在面向对象编程,而不是 ...

  10. python面向接口编程_Python 中的面向接口编程

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...

最新文章

  1. 用指针和函数的方法完成两个数的交换
  2. 普大喜奔:沁恒单片机免费样品申请开始啦!
  3. 一个xmltojson类
  4. 牛客 - 交换(思维+找循环节)
  5. Java EE重新审视设计模式:异步
  6. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
  7. JavaScript-操作DOM对象-更新dom节点
  8. 【BZOJ4816】数字表格,反演+枚举约数
  9. 滚动监听 after选择器
  10. java发牌_Java实现洗牌发牌的方法
  11. linux网络编程学习笔记之四 -----多-threaded服务器
  12. 海康威视 java B/S 开发 流程
  13. android源码分卷压缩和解压
  14. python打印星号组成的三角形_Python利用for循环打印星号三角形的案例
  15. 前端基础学习之css3-(border-image)实现边框图片自适应填充
  16. Linux系统中sit0是做什么的
  17. 容联云通讯php短信接口,短信查询接口_开发文档_容联云通讯
  18. MySQL中事务的持久性实现原理
  19. 智能卡操作系统COS概述
  20. gdb调试[奇牛学院]

热门文章

  1. !!! SQL 数据库开发基础 传智!
  2. Centos 上面用Shell脚本一键安装LAMP环境
  3. “新闻”频道“最新更新”有问题吗?
  4. 《学习之道》第十二章练习困难的部分
  5. 软考解析:2017年下半年下午试卷
  6. Linux中如何恢复rm命令误删除的文件之extundelete编译安装及使用
  7. (转) 如何在JavaScript与ActiveX之间传递数据1
  8. 设计模式09-组合模式
  9. dragstart drag dragend dragenter dragover dragleave drop
  10. 伟大的程序员是怎样炼成的?