Adapter模式(设计模式)

2020-05-09  本文已影响0人  DarknessShadow

对象适配器模式(使用委托的适配器)

个人理解

用一个比喻来描述比较好,比如:中国现在用电的标准电压是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虚拟机就可以了.

上一篇下一篇

猜你喜欢

热点阅读