对象适配器模式(使用委托的适配器)
个人理解
用一个比喻来描述比较好,比如:中国现在用电的标准电压是220V交流电,但是我的手机只能使用20V的电压,我的需求就是需要中间有一个转换器把220V电压转化为20V的电压供我的手机使用。实际情况:220V,需求:20V,转换:适配器。适配器模式可以使用到很多场景中,比如:API升级兼容以往的版本
上代码,看代码实现,摸索思路更好一点
类适配器模式(使用继承的适配器)
FileIO.java
package practice;
import java.io.IOException;
/**
* @Author:DarknessShadow
* @description:需求方(需要适配)
* @date 2020/5/9 14:04
*/
public interface FileIO {
public void readFromFile(String fileName) throws IOException;
public void writeToFile(String fileName) throws IOException;
public void setValue(String key, String value);
public String getValue(String key);
}
FileProperties.java
package practice;
import java.io.*;
import java.util.Properties;
/**
* @Author:DarknessShadow
* @description:适配器(做中间功能转换)
* @date 2020/5/9 14:04
*/
public class FileProperties extends Properties implements FileIO {
public FileProperties() {
}
@Override
public void readFromFile(String fileName) throws IOException {
load(new FileInputStream(new File(fileName)));
System.out.println(getProperty("year"));
}
@Override
public void writeToFile(String fileName) throws IOException {
OutputStream out = new FileOutputStream(fileName);
store(out, "properties增强型适配器");
}
@Override
public void setValue(String key, String value) {
setProperty(key,value);
}
@Override
public String getValue(String key) {
return getProperty(key);
}
}
Main.java
package practice;
import java.io.IOException;
/**
* @Author:DarknessShadow
* @description:调用者,java.util.Properties是被适配者
* @date 2020/5/9 14:03
*/
public class Main {
public static void main(String[] args) throws IOException {
FileIO io = new FileProperties();
io.readFromFile("src/file.txt");
io.setValue("year", "2004");
io.setValue("month", "4");
io.setValue("day", "21");
io.writeToFile("src/newfile.txt");
}
}
对象适配器模式(使用委托的适配器)
把FileIO和FileProperties类改改
package practice;
import java.io.IOException;
/**
* @Author:DarknessShadow
* @description:需求方(需要适配)
* @date 2020/5/9 14:04
*/
public abstract class FileIO {
public abstract void readFromFile(String fileName) throws IOException;
public abstract void writeToFile(String fileName) throws IOException;
public abstract void setValue(String key, String value);
public abstract String getValue(String key);
}
package practice;
import java.io.*;
import java.util.Properties;
/**
* @Author:DarknessShadow
* @description:适配器(做中间功能转换)
* @date 2020/5/9 14:04
*/
public class FileProperties extends FileIO {
private Properties properties;
public FileProperties() {
this.properties = new Properties();
}
@Override
public void readFromFile(String fileName) throws IOException {
load(new FileInputStream(new File(fileName)));
System.out.println(properties.getProperty("year"));
}
@Override
public void writeToFile(String fileName) throws IOException {
OutputStream out = new FileOutputStream(fileName);
properties.store(out, "properties增强型适配器");
}
@Override
public void setValue(String key, String value) {
properties.setProperty(key,value);
}
@Override
public String getValue(String key) {
return properties.getProperty(key);
}
}
类图
类适配模式
对象适配模式
总结:设计模式是一种思维的不断总结的结晶,不能固化思维按照书本的代码就把这个模式定位为这种样式.自我感觉是学习里面解决一些场景的解决方案.迭代器模式:就是在一个容器里面,你想要去遍历或者做其他操作,但是又不想在容器里面操作实现两者的分离,可以使用组合或者聚合的方式定义一个新的类去实现你想要的操作.适配器模式:感觉这种思维在计算机里面使用的很广泛,最好的案例就是Java虚拟机,让Java可以跨平台运行.它就是一个巨大复杂的适配器,上层的Java语法编写的代码不需要动,只需要编写适配不同的系统平台的Java虚拟机就可以了.
网友评论