开放封闭原则之“面向接口编程”

2024-08-27 22:18

本文主要是介绍开放封闭原则之“面向接口编程”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  

开放封闭原则之“面向接口编程”


  前言:

     同样是开放封闭原则,在ITOOjava的项目中,对“面向接口编程”又有了更深刻的理解,下面请听小编徐徐道来:


      开放封闭原则定义:用面向接口编程这就为我们以后程序的扩展性提供基础。“对修改封闭,对扩展开发”。

  利用接口的一个基本用途,规定子类的行为。更为广阔的用途是接口为其他人使用者提供什么用途。模块和模块之

间的解耦就看你的接口设计的是不是合理,是不是好用。这才是从框架设计师角度去思考问题了。 


什么是接口?

      接口就是标准,是用来隔离具体实现的(或者说是和具体实现解耦)。举个生活中的例子就是:各种手机、移动硬

盘等连接上上的USB接口就是标准,大家各自制造自己的具体产品。产品使用者和提供者都遵守这个标准,那么使用

者就不必担心自己电脑上的USB接口是否只能插移动硬盘而不能插手机。



为什么要用接口 ?

   主要是是用于处理多变的情况。

  (1)接口在实际开发过程中最大好处是,你可以按照设计,先把接口写好,然后分配大伙干活的时候,告诉a们去用写好的接口去实现他们的具体功能,而告诉b们,去写那些已经写好但是没有具体的代码的接口,这样可以提高工作效率。并且底层和应用也通过接口做了一个很明显的分层。
 
   (2)接口可以降低耦合性,换句话说,可以让某个模块或功能能够重复利用,这样只要写这功能一次代码就ok了。其他地方要用到的,全部用接口调用来实现


   (3)合理使用接口、继承,拥有良好架构的程序,二次开发上可能会节省很多时间,因为它低耦合 扩展性高。



ITOOJava5.0 代码

       走查之面向接口编程:原来的Service界面:

   
/*** 修改人:通过课程Id、考试Id、试卷Id和数据库表名来计算分数+Daniel+2016-6-14* @param couserId   课程Id* @param examId     考试Id* @param paperId    试卷Id* @param dataBaseName  数据库*/@Overridepublic boolean countScoreByPaperId(String couserId, String examId, String paperId,String dataBaseName) {// 第一步将所有的记录查出来!!boolean flag = false;Map<Serializable, Serializable> map = new HashMap<Serializable, Serializable>();map.put("couserId", couserId);map.put("paperId", paperId);String hqlstrString = "select t.studentID,t.studentName, SUM(t.score) as markScore From PaperRecord t where t.courseID=:couserId and t.paperId=:paperId GROUP BY t.studentID";List<PaperRecord> list = new ArrayList<PaperRecord>();try {// 查询到学生,和成绩信息。list = calculateScoreEao.queryByHql(hqlstrString, map, dataBaseName);List<StudentScore> liststudent = new ArrayList<StudentScore>();for (int i = 0; i < list.size(); i++) {Object ojb = (Object) list.get(i);  



把SQL语句写在CalculateScoreEao.java 中,创建一个接口:
 
   
/*** 修改人:通过课程Id、考试Id、试卷Id和数据库表名来计算分数+Daniel+2016-6-14* @param couserId   课程Id* @param examId     考试Id* @param paperId    试卷Id* @param dataBaseName  数据库表名*/public List<PaperRecord> queryStuAndMarkScoreByKeyword(String couserId, String paperId,String dataBaseName);

 
在CalculateScoreEaoImpl.java 中实现这个接口:
 
/*** 修改人:通过课程Id、考试Id、试卷Id和数据库表名来计算分数+Daniel+2016-6-14* @param couserId   课程Id* @param examId     考试Id* @param paperId    试卷Id* @param dataBaseName  数据库表名*/public List<PaperRecord> queryStuAndMarkScoreByKeyword(String couserId, String paperId,String dataBaseName){Map<Serializable, Serializable> map = new HashMap<Serializable, Serializable>();map.put("couserId", couserId);map.put("paperId", paperId);String hqlstrString = "select t.studentID,t.studentName, SUM(t.score) as markScore From PaperRecord t where t.courseID=:couserId and t.paperId=:paperId GROUP BY t.studentID";return this.CalculateScoreEao.queryStuAndMarkScoreByKeyword(String couserId, String paperId, String dataBaseName);
}



之后:CalculateScoreServiceImpl.java中代码如下:



  

优化后:       

/*** 修改人:通过课程Id、考试Id、试卷Id和数据库表名来计算分数+Daniel+2016-6-14* @param couserId* @param examId* @param paperId* @param dataBaseName*/@Overridepublic boolean countScoreByPaperId(String couserId, String examId, String paperId,String dataBaseName) {// 第一步将所有的记录查出来!!boolean flag = false;List<PaperRecord> list = new ArrayList<PaperRecord>();try {// 查询到学生,和成绩信息。list = calculateScoreEao.queryStuAndMarkScoreByKeyword(String couserId, String paperId,String dataBaseName);List<StudentScore> liststudent = new ArrayList<StudentScore>();for (int i = 0; i < list.size(); i++) {Object ojb = (Object) list.get(i);Object[] objs = (Object[]) ojb;


小结:

          特别是在ITOO这种大型的平台,利用面向接口的编程思想就更能体现出扩展性和维

护性了,ITOOJava平台现在还没有上线,即使是上线之后,也是需要不断的扩展和维护

了,将集成改成接口之后,就真正的做到了开放封闭的原则,方便以后的扩展和维护,

实际操作中也方便分模块的分工协作,就一个大项目肯定是要很多人一同去协作来做

的,这正明显的提高了运行效率、开发和维护的效率。







这篇关于开放封闭原则之“面向接口编程”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112935

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec