接口

本文介绍了面向接口编程的概念及其在实际项目中的应用。通过定义抽象的接口,并让具体的业务类实现这些接口,使得代码更加灵活和可扩展。文章还提供了一个生产场景的例子,展示了如何通过接口实现设备与工厂之间的解耦。

1.面向接口编程就是将程序中的业务逻辑模块给剥离出来,通过接口来对应不同的业务模块

2.interface 来定义接口,其本质就是一个抽象类,接口可以定义成员变量,但是有下列要求:

  • 接口中的成员变量都是静态常量,可以直接通过接口来进行访问,但是不可以进行修改

  • 成员变量在定义的时候就必须完成初始化

public interface MyInterface {
    public int ID=0;
    public  String name="中国";
    public void test();
}
  • 通过implements关键字来指定实现类具体要实现的接口, 在实现类的内部需要对接口所有抽象方法进行实现,同时要求访问权限修饰符,返回值类型,方法名和参数列表必须都保持一致

  • 一个类可以实现多个接口 

public interface MyInterface1{
    public int ID=0;
    public  String name="中国";
    public void test();
}

public interface MyInterface2{
   
    public void use();
}


public class InterfaceTest implements MyInterface1,MyInterface2{
    public void test(){
        System.out.println("这是Test");
    }

    @Override
    public void use() {
        System.out.println("这是use");
    }
}

3.面向接口编程 

  • 某工厂A主要是生产产品A,然后产品A主要是由设备A生产;某工厂B主要是生产产品B,然后产品B主要是由设备B生产;某工厂C主要是生产产品C,然后产品C主要是由设备C生产;

  • 思路:厂商就直接使用这些设备A,设备B,设备C的“父亲”——设备,这里就用到了接口的思想(先定义接口“设备”,再让设备A,设备B,设备C去继承这个接口),因为直接使用设备,最后调用的时候就把不同的设备A,设备B,设备C传入进来就可以了

1.这是所有设备的“父亲”
public interface Equipment {
    public void work();
}


2.设备A继承
public class EquipmentA implements Equipment{
    public void work(){
        System.out.println("生产产品A");
    }
}

3.设备B继承
public class EquipmentB implements Equipment{
    public void work() {
        System.out.println("这是设备B");
    }
}

4.设备C继承
public class EquipmentC implements Equipment{
    public void work() {
        System.out.println("这是设备C");
    }
}


5.工厂直接调用设备“父亲”,这样就为后面铺垫
public class Factory  {
    private Equipment equipment;
    public void setEquipment(Equipment a){
        this.equipment =a;
    }
    public Equipment getEquipment(){
        return equipment;
    }
    public void work(){
        System.out.println("设备开始运行....");
        this.equipment.work();
    }
}


public class Test {
    public static void main(String[] args) {
        EquipmentA equipmentA=new EquipmentA();
        EquipmentB equipmentB =new EquipmentB();
        EquipmentC equipmentC =new EquipmentC();
        
        Factory factory=new Factory();
        //根据不同需要传入不同设备
        factory.setEquipment(equipmentA);
        factory.setEquipment(equipmentB);
        factory.setEquipment(equipmentC);
        factory.work();
    }
}

 

负责业务逻辑的类都必须实现这个接口业务逻辑类BusinessImpl实现接口Business,BusinessImpl.java的示例代码如下: //******* Business.java************** public class BusinessImpl implement Business { private SaveData db; public void DiSaveDate (SaveData db) { this.db = db; } … //根据注入的存储类,存储数据 public void saveData() { … db.saveData(); … } } 编写测试类TestBusiness,TestBusiness.java的示例代码如下: //******* TestBusiness.java************** public class TestBusiness { private Business business = new BusinessImpl(); … //根据注入的存储类,存储数据 public void opraData() { … business. DiSaveDate (new XMLData()); business. saveData (); … } } 如果要完成依赖关系注入的对象,必须实现Business接口。 构造注入 构造注入是指在接受注入的类中定义一个构造方法,并在参数中定义需要注入的类。 (1)为了让类Business接受XMLData的注入,需要为它定义一个构造方法,来接受XMLData的注入。Business.java的示例代码如下: //******* Business.java************** public class Business { private SaveData db; public Business (SaveData db) { this.db = db; } … //根据注入的存储类,存储数据 public void saveData() { … db.saveData(); … } } (2)编写测试类TestBusiness,TestBusiness.java的示例代码如下: //******* TestBusiness.java************** public class TestBusiness { private Business business = new Business(new XMLData()); … //根据注入的存储类,存储数据 public void opraData() { … business. saveData (); … } } 即通过构造函数来完成依赖注入。 从前面对这三种依赖注入的方式中可以看出:其实所有的依赖注入都离不开抽象的支持,也就是说只有"面向接口编程",才能够实现依赖注入。 读者可能还会有疑惑:虽然具体的存储方式和业务逻辑无关了,可不是还要在调用业务逻辑的类里来改变具体的存储方式吗?这样一来,不是还要改代码吗?看起来面向接口编程也挺简单的,那Spring又为开发人员提供了哪些帮助呢?其实,Spring为开发人员提供了调用业务逻辑类的具体方式,也就是说,Spring不再需要开发人员编写调用具体调用业务逻辑的类,而是通过配置文档来实现对业务逻辑的调用,如果具体的存储方式发生了变化,开发人员只需要改变相应的配置文档即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值