面向接口编程(思维培养)
待更新…(19.05.27)
面向接口编程:
IStrorage 接口
UDisk 实现IStrorage接口
HardDisk 实现IStrorage接口
MP3 实现IStrorage接口
Phone
PhoneAdapter 实现IStrorage接口
Computer
CommonDAO<T>接口
QuestionTypeDAO接口 继承自CommonDAO<QuestionType>
QuestionTypeDAOImpl实现类 实现QuestionTypeDAO接口
CommonService<T>接口
QuestionTypeService接口 继承自CommonService<QuestionType>接口
QuestionTypeServiceImpl实现类 实现QuestionTypeService接口
接口依赖于QuestionTypeDAO
private QuestionTypeDAO questionTypeDAO;
及setter方法
QuestionTypeController控制器
private QuestionTypeService questionTypeService;
举例:
实物举例 | 实物的一些属性或功能 |
---|---|
computer | 电脑上有USB接口,可连接一些产品 |
– | – |
UDisk | 一个U盘,可直接插到电脑的USB口上与电脑连接 |
HardDisk | 一个移动硬盘,可直接插到电脑的USB口上与电脑连接 |
MP3 | 一个MP3,可直接插到电脑的USB口上与电脑连接 |
– | – |
Phone | 一个老式手机,需要一个转换头,才能插到电脑的USB口上与电脑连接 |
UDisk\HardDisk\MP3 , 具有相同的标准 , 即规范相同
Phone , 因为需要转换头,不符合规范
规范相同,可以实现一个接口
UDisk\HardDisk\MP3插上电脑的USB插口即可与电脑连接 , USB插口就是 接口 ,也即本文最顶代码区中的 IStrorage 接口
不符合规范,就需要一个转换器来实现一个接口
Phone , 老式手机所需要的转换器即 PhoneAdapter ,使用转换器之后便可与 IStrorage 接口 相连,再连接到computer
====================================
IStorage接口
public interface IStorage {
void read(); //读取数据
void write(); //写数据
}
MP3类实现了IStorage接口,变成 接口类
public class MP3 implements IStorage {
public MP3()
{
System.out.println("构造MP3");
}
private String brand,color;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
System.out.println("设置Brand");
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
System.out.println("设置color");
this.color = color;
}
@Override
public void read() {
System.out.println("读取品牌为"+brand+"颜色为"+color+"的MP3");
}
@Override
public void write() {
System.out.println("写入品牌为"+brand+"颜色为"+color+"的MP3");
}
}
Computer类
public class Computer {
public Computer()
{
System.out.println("构造computer");
}
private IStorage storage;
public void setStorage(IStorage storage) {
System.out.println("插入移动设备"+storage.getClass().getName());
this.storage = storage;
}
public void readData()
{
storage.read();
}
public void writeData()
{
storage.write();
}
}
这时我们看一下MP3连接电脑后的打印情况
public static void main(String[]args){
Computer computer = new Computer();
MP3 mp3 = new MP3();
mp3.setBrand("华为ie");
mp3.setColor("炫彩");
computer.setStorage(mp3); //MP3变为接口类
computer.readData();
}
打印如下:
构造MP3
设置Brand
设置color
插入移动设备MP3
读取品牌为华为ie颜色为炫彩的MP3
====================================
手机不能直接连接电脑,需要一个转换器,即PhoneAdapter , 也即 适配器 (适配器设计模式)
PhoneAdapter
//适配器设计模式
public class PhoneAdapter implements IStorage { //实现接口用于连接电脑
private Phone phone;
public void setPhone(Phone phone) { //连接手机
this.phone = phone;
}
@Override
public void read() {
phone.readIt();
}
@Override
public void write() {
phone.writeIt();
}
}
打印一下看看
Phone phone = new Phone();
PhoneAdapter adapter = new PhoneAdapter();
adapter.setPhone(phone);
computer.setStorage(adapter);
====================================
但是我们发现每次new一个对象,并对这个对象进行赋值等操作还是很繁琐的 ! 这时我们可以创建一个 类 来完成这些繁琐的操作
即 超级工厂设计模式
超级工厂设计模式
public class ComputerFactory {
public static Computer getInstance(String type)
{
Computer computer = new Computer();
if("MP3".equals(type))
{
MP3 mp3 = new MP3();
mp3.setBrand("华为");
mp3.setColor("沙滩金");
computer.setStorage(mp3);
}
else if("Phone".equals(type))
{
Phone phone = new Phone();
PhoneAdapter adapter = new PhoneAdapter();
adapter.setPhone(phone);
computer.setStorage(adapter);
}
return computer;
}
}
来打印一下他吧
Computer computer = ComputerFactory.getInstance("Phone");
computer.readData();
====================================
但是我们发现在写 超级工厂 这个类时,其实也是比较繁琐的,那有没有什么方法使其更简化呢?
答案就是 Spring框架
Spring框架
看一下spring的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="computer" class="com.wanmait.demo.Computer"> //computer类在这个包下
<property name="storage" ref="mp3"/> //设置 属性storage的值 依赖为mp3对象
</bean>
<bean id="udisk" class="com.wanmait.demo.UDisk"/>
<bean id="mp3" class="com.wanmait.demo.MP3">
<property name="brand" value="华为"/> //设置 属性brand的值 为"华为"
<property name="color" value="落日金"/>
</bean>
</beans>
打印一下他看看吧
//加载spring框架
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//给spring要一个computer
Computer computer = (Computer)ac.getBean("computer");
computer.readData();