• IOC解耦-面向接口编程的优点


    原文:https://blog.csdn.net/jj_nan/article/details/70161086 

    参考:https://www.cnblogs.com/landeanfen/p/4770609.html

    IOC:http://jinnianshilongnian.iteye.com/blog/1413846

    1 首先什么是面向接口编程?

    面向接口编程就是先把客户的业务逻辑线提取出来,作为接口,业务具体实现通过该接口的实现类来完成。 当客户需求变化时,只需编写该业务逻辑的新的实现类,通过更改配置文件(例如Spring框架)中该接口 的实现类就可以完成需求,不需要改写现有代码,减少对系统的影响。

    2 面向接口编程的优点?

    • 降低程序的耦合性。其能够最大限度的解耦,所谓解耦既是解耦合的意思,它和耦合相对。耦合就是联系,耦合越强,联系越紧密。在程序中紧密的联系并不是一件好的事情,因为两种事物之间联系越紧密,你更换其中之一的难度就越大,扩展功能和debug的难度也就越大。
    • 易于程序的扩展;
    • 有利于程序的维护;

    3 接口编程在设计模式中的体现:开闭原则

    4 一个老生常谈的例子:JDBC

    SUN公司提供了一套JDBC接口规范,MySql公司开发了自己对JDBC规范的驱动,Oracle公司开发了一套自己
    的JDBC规范的驱动。当用户安装的是MySQL数据库的时候,在spring容器中配置mySQL的IOC,然后在java
    代码中调用MySQL驱动实现类,同理,当用户安装的是Oracle数据库的时候,在spring容器中配置Oracle
    的IOC,然后在java代码中调用Oracle驱动实现类。

    5 一个简单的spring接口编程的例子:(假如给学校做一个网页:下面的模块是一个子模块)

    客户需求:显示”西安电子科技大学”的”地理位置”和“经纬度”

    • 第一步:先建立一个school接口类: School.java
    package com.wu.xidian;
    
    /**
     * @author wunan E-mail: 2215225782@qq.com
     * @version 创建时间:2017年4月13日 下午4:20:28 School接口类
     */
    public interface School {
        // 显示地理位置
        void showGeography();
        // 显示经纬度
        void showLangtutide();
    }
    • 第二步:实现接口类:
    package com.wu.xidian;
    
    /**
     * @author wunan E-mail: 2215225782@qq.com
     * @version 创建时间:2017年4月13日 下午4:23:53 接口类的实现
     */
    public class Xidian_SchoolImpl_N implements School {
    
        @Override
        public void showGeography() {
            System.out.println("西安电子科技大学地址 :西安市-雁塔区-太白南路-西安电子科技大学(北校区)");
        }
    
        @Override
        public void showLangtutide() {
            System.out.println("西安电子科技大学地理位置:34.2369070000,108.9232450000");
        }
    }
    • 第三步:创建一个实例:来显示学校
    package com.wu.xidian.test;
    
    import com.wu.xidian.School;
    
    /**
     * @author wunan E-mail: 2215225782@qq.com
     * @version 创建时间:2017年4月13日 下午4:44:19 创建一个实例:来显示学校
     */
    public class XidianSchool {
    
        private School school = null;
    
        // 注意:此处是对接口的set
        public void setSchool(School school) {
            this.school = school;
        }
    
        public XidianSchool() {
        };
    
        public XidianSchool(School s) {
            this.school = s;
        }
    
        // 显示
        public void getSchoolInfo() {
            school.showGeography();
            school.showLangtutide();
        }
    }
    • 第四步编写测试类:
    package com.wu.xidian.test;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import com.wu.xidian.School;
    
    /**
     * @author wunan E-mail: 2215225782@qq.com
     * @version 创建时间:2017年4月13日 下午5:01:24 测试:
     */
    public class Test1 {
        @Test
        public void demo01() {
            // 从spring容器获得
            // 1 获得容器
            String xmlPath = "com/wu/xidian/applicationContext.xml";
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
            // 2获得内容 --不需要自己new,都是从spring容器获得
            XidianSchool bean = (XidianSchool) applicationContext.getBean("XidianSchool");
            bean.getSchoolInfo();
        }
    }
    • 第五步:编写applicationContext.xml文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="XidianSchool" class="com.wu.xidian.test.XidianSchool">
    <property name="school" ref="N"/> 
    </bean>
    <bean id="N" class="com.wu.xidian.Xidian_SchoolImpl_N"></bean>

    好了,这下问题解决了!
    张校长:西电有两个校区,我需要你们把两个校区的地址和经纬度都显示出来!
    项目主管:可是,业务要求项目书上要求中只要求显示一个校区的地址和经纬度啊,这。。。。
    小吴程序员:很淡定的说,没问题,可以解决!
    为何他会如此的理直气壮,因为他采用了面向接口的编程:
    添加业务:(不需要修改原来的代码,只需要新建一个类继承原来的接口)

    • 第六步:添加Xidian_SchoolImpl_S.java
    package com.wu.xidian;
    
    /**
     * @author wunan E-mail: 2215225782@qq.com
     * @version 创建时间:2017年4月13日 下午4:23:53 显示南校区的信息:
     */
    public class Xidian_SchoolImpl_S implements School {
        @Override
        public void showGeography() {
            System.out.println("西安电子科技大学地址 :西安市-长安区-西隆段-西安电子科技大学(南校区)");
        }
    
        @Override
        public void showLangtutide() {
            System.out.println("西安电子科技大学地理位置:34.1295220000,108.8400530000");
        }
    }
    • 第七步:修改applicationContext.xml文件即可!(添加Xidian_SchoolImpl_S的IOC)
  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/chrisghb8812/p/9845587.html
Copyright © 2020-2023  润新知