`
jiopi
  • 浏览: 32317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义接口及实现与实现类解耦

    博客分类:
  • Java
阅读更多

在开发Java系统时,很难避免使用第三方类库,比如 缓存程序,Java Mail,等

 

自定义cache接口实现与缓存框架解耦

http://www.iteye.com/topic/697343

 

一文让我觉得这个理念应当可以应用于更加广泛的场合。

 

在上文中有人提到

“自定义接口的做法等同于创造标准,在没有规范标准的缓存框架中创造标准很难。”

 

将自定义接口称之为创造标准倒也不为过,不过这个标准是以当前系统的调用方式为导向的,使用范围也只是当前系统,并不是以兼容所有实现类为导向的,所以从一般标准的范围来看,自定义接口我认为算不上标准,自定义接口只是为了将自己的系统与实现类解耦,并不是为了兼容所有实现类而创建的标准。

 

因此,我觉得如果一个功能存在多种类型的实现类,这些实现类可能表现为不同的适用场景,例如缓存系统,此时最好应当将自己的系统与实现类解耦。

 

另外从易用的角度来看,如果实现类的API过于复杂,如SUN的Java Mail API,重新定义一套符合自己系统的API也有助于让调用部分的代码更清晰。

 

从可复用的角度来讲,通过自定义功能清晰的API,更有助于该API的复用。由于API与实现类分离,从而就可以根据系统需求来配置一个功能API的实现类,比如缓存系统,就可以根据实际需求在系统中的不同位置采用不同的缓存系统。这也正是IoC带来的优点。

 

然而在传统Java系统中,即便是使用了IoC,实现类的类名一样还是会出现在配置文件中,如果配置了若干实现类,那么在更换实现类时必须知道需要将哪几个实现类替换掉,从而增加了实现替换的复杂度。

 

借助JIOPi,可以让这一过程变得更加容易。

 

下面是一个自定义的邮件发送的API的调用示例

 

MyMailSender.sendMyMail("姓名<to@yourmail.com>""hello""content test");   

借助JIOPi忽略实现类的特性,系统的lib目录只需一个MyMailAPI.jar,而无需部署javamail.jar,以及相关实现类的Jar包,让lib目录更易于管理

其中 MyMailSender 是 MailSender 接口的伪实现类,因为接口不能定义static方法,因此在伪实现类中增加static方法简化方法调用,借助JDK1.6的新特性,MyMailSender 的依赖注入不再依赖任何第三方API,当需要更换实现类时,只需要更改配置文件,而无需更改 MyMailSender 的代码

详细介绍请参阅:

http://jiopi.iteye.com/blog/693423

 

 

分享到:
评论

相关推荐

    21-05-14_Nop4.4(005_自定义接口及其实现类依赖注入到内置依赖注入容器中,默认页被正常启动).rar

    【标题】"21-05-14_Nop4.4(005_自定义接口及其实现类依赖注入到内置依赖注入容器中,默认页被正常启动)" 涉及的是 nopCommerce 4.4 版本的一个具体开发实践,主要关注的是自定义接口的创建、其实现类的编写以及如何...

    android 自定义控件实现demo收集 及 框架收集

    下面将对"android 自定义控件实现demo收集 及 框架收集"这一主题进行深入探讨。 首先,自定义控件在Android应用开发中扮演着重要角色。它们允许开发者根据项目需求创建具有独特功能和外观的组件,超越了Android SDK...

    自定义观察者模式

    自定义观察者模式时,可以创建一个Subject接口或抽象类,包含添加、删除观察者的方法,如`addObserver(Observer observer)`、`removeObserver(Observer observer)`,以及通知所有观察者的方法,如`notifyObservers()...

    QT自定义tableModel和使用sqltablemodel

    在QT中,数据视图模型(TableModel)是用于展示数据的核心组件,它与控件如QTableView、QListView等进行交互,实现了数据和视图之间的解耦。本篇文章将深入探讨如何在QT中自定义TableModel以及如何使用SQLTableModel...

    自定义Spinner

    - `SpinerWindowDemo`可能包含了一个自定义的Spinner类,该类可能继承自Spinner,并在其内部实现了自定义的弹出窗口逻辑。 - 项目的布局文件可能包含了一个或多个Spinner实例,这些实例使用了自定义的Spinner类。 ...

    java实现观察者模式-自定义的观察者接口和主题类

    观察者模式都能帮助实现对象之间的松耦合、依赖关系的解耦,并提供一种动态的消息通知机制

    springboot 同步解耦 异步化

    只需在配置类上添加`@EnableAsync`,并实现`AsyncConfigurer`接口,定义线程池大小和超时时间。 2. **@Async**:在需要异步执行的方法上添加`@Async`注解,SpringBoot会自动将这个方法放入配置的线程池中执行。这种...

    用Hibernate实现领域对象的自定义字段

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...

    策略模式实现rocketmq的消息处理器解耦-完整代码.zip

    3. 注解策略:使用自定义注解(如`@MessageHandler`)标记这些实现类,以便在运行时能够根据注解信息找到合适的处理器。 4. 注解扫描与注册:在启动时,应用会扫描带有`@MessageHandler`注解的类,并将它们注册到一...

    DLL导出类的三种方法,导出接口类,导出类指针,导出类,不建议使用导出类

    在实际开发中,推荐使用导出接口类或导出类指针的方式,它们能更好地实现模块间的解耦,提高代码的可维护性和可扩展性。对于需要传递对象实例的情况,可以考虑使用智能指针如`std::unique_ptr`或`std::shared_ptr`来...

    Mybatis自定义框架及使用1

    - **环境搭建注意事项**:创建 Mybatis 工程时需遵循一定的命名规则,如映射文件名与 DAO 接口名相同,`namespace` 与接口全限定名匹配,`id` 与方法名匹配,以实现无须编写 DAO 实现类即可使用。 通过理解以上...

    java SPI机制实现服务接口和服务实现分离源码Demo

    这种机制使得应用程序能够与多个第三方组件进行交互,而无需在编译时硬编码具体的实现类。SPI机制的核心是`java.util.ServiceLoader`类,它允许我们按照约定在`META-INF/services`目录下创建配置文件,来指定哪些类...

    Android自定义View实现新功能指引+ListView中使用策略模式

    - **代码解耦**:视图的实现与Adapter分离,便于维护和扩展。 - **灵活的扩展性**:添加新的视图类型只需要新增策略类,无需修改已有代码。 - **性能优化**:可以通过复用不同类型的convertView,提高ListView滚动时...

    Hibernate使用——自定义数据类型

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。在实际项目开发中,有时我们可能需要对数据库中的某些字段使用自定义的...

    自定义JSP标签样例

    2. 标签处理类(Tag Handler Class):这是实现自定义标签逻辑的Java类,它实现了`javax.servlet.jsp.tagext.Tag`接口或其子接口。 3. 标签文件(Tag File):可选的,用于简化标签定义,类似于HTML模板,可以包含...

    自定义事件与参数(C#)

    ### 自定义事件与参数(C#) 在C#编程中,事件是一种特殊的委托类型,用于封装方法调用,这些方法通常响应对象状态的变化或其他动作的发生。事件是.NET框架中的一个核心概念,它允许对象之间进行通信,而无需彼此...

    借助spring自定义命令执行器

    自定义命令执行器就是一种实现业务解耦的方式,它提供了一个通用的接口,用于执行各种特定任务,而不是直接引用具体的业务类或方法。 2. **命令执行器**:命令执行器是一个设计模式,它的核心思想是将命令(即方法...

    自定义Dao,反射实现

    DAO是应用程序中的一个接口或抽象类,它提供了对数据存储的抽象,使得业务逻辑层可以不直接与数据库交互,而是通过DAO进行。这有助于解耦业务逻辑和数据访问逻辑,使得系统更加灵活,易于测试和维护。 自定义Dao时...

    android 纯自定义数字键盘输入

    这些可以通过在自定义键盘类中添加相应逻辑来实现。 在`KeyDemo`的代码中,我们还能学习到如何测试和调试自定义键盘,例如设置断点,查看触摸事件的传递流程,以及验证输入数据的正确性。这对于理解Android事件分发...

Global site tag (gtag.js) - Google Analytics