理解适配器模式

2018-11-23  本文已影响0人  梦的飞翔_862e
概念理解

适配器是将一个接口转换为另一个接口的一种实现,它是一种结构型模式。原接口和目标接口本来不兼容,通过适配器类,可以使用目标接口来调用原接口的方法。

场景描述

每个国家的电压是不一样的, 中国室内的电压一般是220v,美国,日本的电压是110v,假设笔记本需要的电压是12.6v 这时,就需要适配器,将室内电压转为笔记本需要的电压。

设计一:对象适配器

对象适配器模式是适配器实现目标接口,持有对原接口的引用。

public interface  ChinaVoltageInterface {
    void use220v();
}
public class ChinaVoltageInterfaceImpl implements ChinaVoltageInterface {
    @Override
    public void use220v() {
        System.out.println("this is 220v");
    }
}
public interface NotebookVoltageInterface {
    void use12v();
}
public class ChinaVoltageToNotebookAdapter implements NotebookVoltageInterface {
    private ChinaVoltageInterface chinaVoltageInterface;
    public ChinaVoltageToNotebookAdapter(ChinaVoltageInterface chinaVoltageInterface) {
        this.chinaVoltageInterface=chinaVoltageInterface;
    }

    @Override
    public void use12v() {
        System.out.println("notebook use 12v ");
        System.out.println(" notebook voltage use china voltage");
        chinaVoltageInterface.use220v();
    }
}
public class TestAPP {
    public static void main(String[] args) {
        ChinaVoltageInterface chinaVoltageInterface = new ChinaVoltageInterfaceImpl();
        NotebookVoltageInterface notebookVoltageInterface = new ChinaVoltageToNotebookAdapter(chinaVoltageInterface);
        notebookVoltageInterface.use12v();
    }
}

设计二:类适配器模式
类适配器模式是适配器继承原接口实现类,然后实现目标接口。


public class ChinaVoltageToNotebookAdapter2 extends ChinaVoltageInterfaceImpl implements NotebookVoltageInterface {

    @Override
    public void use12v() {
        System.out.println("notebook use 12v ");
        System.out.println(" notebook voltage use china voltage");
        super.use220v();
    }
}
public class TestAPP {
    public static void main(String[] args) {
        NotebookVoltageInterface notebookVoltageInterface =new ChinaVoltageToNotebookAdapter2();
        notebookVoltageInterface.use12v();
    }
}
enumeration转iterator实例:使用适配器
public class EnumerationIterator implements Iterator {
    private Enumeration enumeration;

    public EnumerationIterator(Enumeration enumeration) {
        this.enumeration = enumeration;
    }

    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements();
    }

    @Override
    public Object next() {
        return enumeration.nextElement();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}
适配器与装饰器的区别

装饰器是在原接口的基础上增加新的操作,来实现不同的功能,适配器是原有接口的一个伪装,把原接口当做目标接口来使用,并不会增加新的操作。

代码实例https://github.com/jxl198/designPattern/tree/master/adapter

上一篇 下一篇

猜你喜欢

热点阅读