- 接口
- 接口的多态性
- 接口总结
- 接口练习
- 接口USB
- 实现接口的匿名类对象(重点)
- 实现比较对象接口
- 面向接口的编程思想
- 工厂设计模式
- 基本结构
- 接口IWorkFactory
- 接口Work
- 测试类
- 总结
- 代理模式
- 被代理类
- 代理类
- 测试类
- 总结
接口
重点:
- 接口可理解为彻底的抽象类(只含有常量和抽象方法)
即属性都是常量,方法都是抽象方法 - 接口定义功能,被类实现(不是继承,因为单继承,多实现)
- 类与接口的关系:实现
- 接口修饰符:public或default
- 实现接口后就有接口的功能
- 接口没有构造器,不可以实例化
- 类的继承使得创建某类对象一定会上溯,从而调用Object构造器(回顾)
- 属性修饰符省略了public static final
- 方法修饰符省略了public abstract
1. Serializable接口定义序列化相关的功能,实现该接口,代表String类型对象可序列化
2. 实现Comparable接口的可以比较两元素大小
错误原因:方法权限修饰符为default,要求为public,重写不能降低可见性(见重写章节)
- 接口可多实现,关注接口多实现的写法
- 实现所有接口的方法,方可实例化,不然为抽象类
- 接口间的继承关系
- GG类既要实现MM接口(接口的父接口)的方法,也要实现JJ接口的方法
小tips:
可以迅速写接口的方法
接口的多态性
背景:Duck类实现了这三个接口
测试类
- 接口没有构造器,但可以有接口的声明
- 子类的对象实体赋给父类引用,父类不仅可以是继承的父类,还可以是子类实现的接口,同样有从小往大的转化过程
- 关注接口的声明(作为形参)
- 关注虚拟方法调用
接口总结
- 接口不需要考虑层次关系
- 接口定义规范,如Collection(集合接口)
- 接口解除耦合关系(原先通过子父类获取方法,现在直接实现接口)
接口练习
接口USB
- 定义标准尺寸(不可更改,接口里的常量)
- 定义功能(比如连接,退出)
- 驱动理解为接口的实现类的集合
接口实现类
打印机类和U盘类
电脑类
- 传入接口形参
- 编译时是抽象方法,实际执行具体实现类的方法
实现接口的匿名类对象(重点)
实现USB的接口未知,称为匿名类
- USB替代匿名类的构造器位置,大括号内书写匿名类实现接口的具体方法
- 下方写法更简略
实现比较对象接口
题目:
测试类:
父类
子类
- 写法类比equals方法
- 当传入非同类对象时,抛出异常
面向接口的编程思想
- Java应用程序要连接数据库,进行增删改查
- JDBC:一类标准,大部分是接口(要实现的功能定义为接口),Sun公司提供
- 不同数据库厂商提供不同驱动(XXXX Driver),驱动即实现接口的具体类的集合
- 解决了适配性的问题,Java应用程序只需要面向JDBC编程即可
工厂设计模式
基本结构
- 上图IWorkFactory接口的功能是返回work对象,但不造是哪个具体work对象,仅保留功能(不创建Work对象)
从而定义getWork方法,由work的“子类”(work接口的具体实现类)决定创建的具体work对象 - 一句话就是:IWorkFactory接口创建对象的过程延迟到子类(特殊的子类)来完成
接口IWorkFactory
接口Work
- 上图IWorkFactory接口实现类是返回下图Work接口的实现类的
(如学生工厂类返回学生类) - IWorkFactory接口没有决定返回哪个对象,由具体实现类来决定返回的对象,只不过那个对象是由Work接口来继承(特殊的继承)到的(有点乱)
测试类
- 编译期看就是接口间在操作
- 具体运行时是实现类在进行
总结
- 本质是创建对象的时机问题
- 工厂模式中,接口先定义功能,真正需要使用时
由子类决定创建时机以及创建谁的对象
代理模式
接口名字特别,表示代理的是对象
左边为代理类,右边为被代理类
调用代理类方法,希望真正执行被代理类的方法
被代理类
代理类
- 定义接口类型的变量(Object object)
- 在代理类构造器中将属性(被代理类)实例化
测试类
调用方法之前,创建代理类对象时,属性(即被代理类)初始化
总结
- 上方为静态代理模式(代理类和接口一一对应,不同接口要创建不同的代理类)
- 后续学习基于反射的动态代理模式:一个代理类实现所有被代理类功能,需要
动态创建代理类对象