java面向接口编程案例说明

我们都知道在java中有(OCP:Open/Closed Principle)原则,对扩展开放,对修改关闭.但是在实际中如果使用传统的开发方式很难做到这一点,比如如下场景:web service dao层中增加用户业务逻辑上有变化,如何才能做到不改变原代码的情况下,对新增功能进行扩展呢?
这里就需要用到java的面向接口编程.接下来将通过这一案例对面向接口编程做演示.
首先:原有环境如下图


原环境.JPG

service层(模拟功能):

package com.xfz.service;

public class UserService1 {
    public void addUser(){
        System.out.println("增加用户");
    }
}

web层(模拟功能测试)

package com.xfz.web;

import com.xfz.service.UserService1;

public class UserTest {
    public static void main(String[] args) {
        UserService1 user = new UserService1();
        user.addUser();
    }
}

现在业务层用户功能更新,由于不能在原代码上进行修改,所以这里在业务层新建类UserService2来进行模拟:
02.JPG

service层UserService2代码(模拟功能更新):

package com.xfz.service;

public class UserService2 {
    public void addUser(){
        System.out.println("增加用户新功能");
    }
}

现在业务层用户功能更新,由于不能在原代码上进行修改,所以这里在业务层新建类UserService2来进行模拟:
到这里问题就来了:现在要实现UserService2的新功能,如果使用传统方式在web层UserTest下进行创建UserService2类对象调用方法,那么今后每次增加新功能都将重复进行创建新对象调用新方法(功能),而这种对原代码进行修改的方式不符合java 开闭原则,对扩展开放对修改关闭.所以这里我们将使用面向接口的方式来对web层service层dao层的代码进行耦合性分离,实现新增功能无需修改原代码同样也能实现新增功能.

思想:面向接口编程,解开三层耦合性
步骤:
1.创建UserInterface接口


图片.png

UserInterface接口代码:

package com.xfz.service;

public interface UserInterface {
    public void addUser();
}

2.UserService1和UserService2实现UserInterface 接口


图片.png

UserService1代码:

package com.xfz.service.impl;
import com.xfz.service.UserInterface;

public class UserService1 implements UserInterface{
    public void addUser(){
        System.out.println("增加用户");
    }
}

UserService2代码:

package com.xfz.service.impl;
import com.xfz.service.UserInterface;

public class UserService2 implements UserInterface{
    public void addUser(){
        System.out.println("增加用户新功能");
    }
}

3.在项目根目录src下创建bean.properties配置文件


图片.png

bean.properties配置文件内容:

#bean工厂的配置,键是接口名=值是该接口的实现类
UserInterface=com.xfz.service.impl.UserService2

4.创建工具类(传入接口生产实现类)



工具类BeanFactory代码:

package com.xfz.utils;

import java.util.ResourceBundle;

public class BeanFactory  {
    /**
     *  接收接口,返回他的实现类对象
     *  接收的是接口的class对象
     *  任意类的class对象都是Class对象
     */
    public static <T> T getInstance(Class<T> clazz )  {
        //读取配置文件,获取接口实现类的类名,反射创建对象
        //获取出传递的接口名字吗
        String simpleName = clazz.getSimpleName();
        ResourceBundle resourceBundle = ResourceBundle.getBundle("bean");
        //传递接口名作为键,获取值,是实现类的全名
        String className = resourceBundle.getString(simpleName);
        T t = null;
        //反射创建对象
        try {
            Class cla = Class.forName(className);
            //创建该类的对象,返回Object
            t = (T) cla.newInstance();
        }catch (Exception ex){ex.printStackTrace();}
        return t;
    }
}

5.web层代码使用接口接收接口实现类对象(功能块下所有功能)


图片.png

web层UserTest代码


import com.xfz.service.UserInterface;
import com.xfz.service.impl.UserService1;
import com.xfz.utils.BeanFactory;

public class UserTest {
    public static void main(String[] args) {
//        UserService1 user = new UserService1();
//        user.addUser();
        UserInterface user = BeanFactory.getInstance(UserInterface.class);
        user.addUser();
    }
}

右键运行后,成功执行UserService2新增功能.并且今后扩展相关功能,原代码无需在改变,只需在将新功能类在配置文件进行配置即可.



Spring框架基本也是同上原理,不过现在注解开发也是占主流,但是理解面向接口编程对于今后的知识拓展还是很有帮助的.
以上就是本次面向接口编程案例的演示.有问题欢迎在评论区进行讨论.O(∩_∩)O

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,340评论 2 59
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,979评论 11 349
  • 沉浸在深深的绝望情绪里~
    e83853d46782阅读 116评论 0 0
  • 薄雾锁秋山, 莲叶遮晚莲。 不知意何在, 唯我独自闲。
    辉煌Ad098阅读 239评论 0 1
  • 我常常会想我是怎样的一个人,想到许多的形容词,也许在别人眼里的我是好的或是不好的。 但我也有别人不知道的一面。我喜...
    花灯初夏阅读 449评论 1 9

友情链接更多精彩内容