热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

  



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

  前言:

     同样是开放封闭原则,在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 数据库
*/
@Override
public boolean countScoreByPaperId(String couserId, String examId, String paperId,
String dataBaseName) {
// 第一步将所有的记录查出来!!
boolean flag = false;
Map map = new HashMap();
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 list = new ArrayList();
try {
// 查询到学生,和成绩信息。
list = calculateScoreEao
.queryByHql(hqlstrString, map, dataBaseName);
List liststudent = new ArrayList();
for (int i = 0; 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 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 queryStuAndMarkScoreByKeyword(String couserId, String paperId,
String dataBaseName){
Map map = new HashMap();
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
*/
@Override
public boolean countScoreByPaperId(String couserId, String examId, String paperId,
String dataBaseName) {
// 第一步将所有的记录查出来!!
boolean flag = false;

List list = new ArrayList();
try {
// 查询到学生,和成绩信息。
list = calculateScoreEao
.queryStuAndMarkScoreByKeyword(String couserId, String paperId,
String dataBaseName);
List liststudent = new ArrayList();
for (int i = 0; i Object ojb = (Object) list.get(i);
Object[] objs = (Object[]) ojb;


小结:

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

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

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

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

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


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
author-avatar
JJ关键词
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有