设计模式之详解——适配器模式

适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

类的适配器模式

当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

/**
 * 核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口是Targetable,通过Adapter类,
 * 将Source的功能扩展到Targetable里,看代码:
 */
public class Source {
    public void method1() {
        System.out.println("原方法");
    }
}
interface Targetable {

    /* 与原类中的方法相同 */
    public void method1();

    /* 新类的方法 */
    public void method2();
}
class Adapter extends Source implements Targetable {

    @Override
    public void method2() {
        System.out.println("扩展方法");
    }
}
class AdapterTest {

    public static void main(String[] args) {
        Targetable target = new Adapter();
        target.method1();
        target.method2();
    }
}

对象的适配器模式

当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

/**
 * 核心思想就是:有一个Source1类,拥有一个方法,待适配,目标接口是Targetable1,通过Wdapter类,
 * 将Source1的功能扩展到Targetable1里,看代码:
 */

public class Wrapper implements Targetable1 {

    private Source1 source;

    public Wrapper(Source1 source){
        super();
        this.source = source;
    }
    @Override
    public void method2() {
        System.out.println("扩展方法");
    }

    @Override
    public void method1() {
        source.method1();
    }
}
class Source1 {
    public void method1() {
        System.out.println("原方法");
    }
}
interface Targetable1 {

    /* 与原类中的方法相同 */
    public void method1();

    /* 新类的方法 */
    public void method2();
}

接口的适配器模式

当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper2,实现所有方法,我们写别的类的时候,继承抽象类即可。

/**
*接口的适配器模式
*/

public interface Sourceable {
    //鼠标方法
    public void mouse();
    //键盘方法
    public void keyborad();
}
/*
在USB接口中可以插入键盘和鼠标任意一个,适配器的目的就是尝试的去匹配插入接口的元件(鼠标或键盘),
简单来说就是插入那个就实现那个方法
*/
abstract class Wrapper2 implements Sourceable{
    public void mouse(){}
    public void keyborad(){}
}
//插入鼠标
class SourceSub1 extends Wrapper2 {
    public void mouse(){
        System.out.println("鼠标插入了");
    }
}
//插入键盘
class SourceSub2 extends Wrapper2 {
    public void keyborad(){
        System.out.println("键盘插入了");
    }
}
class WrapperTest {

    public static void main(String[] args) {
        Sourceable source1 = new SourceSub1();
        Sourceable source2 = new SourceSub2();

        source1.mouse();
        source1.keyborad();
        source2.mouse();
        source2.keyborad();
    }
}

设计模式图解
单例模式

猜你喜欢

转载自blog.csdn.net/qq_38380667/article/details/82811977