设计模式之结构型模式(一)适配器模式

92 阅读3分钟

有哪些结构型模式

1.适配器模式 2.桥接模式 3.组合模式 4.代理模式 5.装饰模式 6.外观模式 7.享元模式

由于学习难度较大 并且相对用途较少 本章不会讲解享元模式

接下来针对以上6种设计模式进行单独讲解

1 适配器模式

1.1 定义

将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)

举个简单例子: 笔记本电源为20V,家庭用电为220V,两者本不兼容,通过充电器转换之后两者便可兼容,本例中充电器便是一个适配器

1.2 应用场景

系统需要使用一些现有的类,而这些类的接口(例如方法名)不符合系统的需要,甚至没有这些类的源代码,典型的应用比如spring中的各种Adapter

适配器模式可以将目标类和适配者类解耦。通过引入一个适配器类来重用现有的适配者类,无须修改原有结构

适配器模式可以把多个不同的适配者适配到同一个目标

1.3 UML图

image.png 从上面UML图中可以看出

Target类定义客户所需要的类,负责与客户端进行直接的交互

Adapter类作为适配器类,实现Target的方法,并且持有Adaptee类,通过Adapter将Target和Adaptee类产生联系

Adaptee类作为适配类,表示要被适配的角色

1.4 具体代码实现

public interface Target {  
    void request();  
}  
  
// 定义Adaptee类,适配者实现Adaptee接口,具备某些功能  
public class Adaptee {  
    public void specificRequest() {  
        System.out.println("Adaptee specific request.");  
    }  
}  
  
// 定义Adapter类,适配器实现Target接口,并且持有Adaptee对象  
public class Adapter implements Target {  
    private Adaptee adaptee;  
  
    public Adapter(Adaptee adaptee) {  
        this.adaptee = adaptee;  
    }  
  
    @Override  
    public void request() {  
        adaptee.specificRequest();  
    }  
}  
  
// 客户端代码,使用Target接口与适配器交互  
public class Client {  
    public static void main(String[] args) {  
        Adaptee adaptee = new Adaptee();  
        Target target = new Adapter(adaptee);  
        target.request();  
    }  
}

1.5 扩展

缺省适配器模式:

当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求。它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式

//该接口为适配者接口
public interface Interface {
    void fun1();
    void fun2();
    void fun3();
    void fun4();
    void fun5();
}
//该类为缺省适配器的核心抽象类
public abstract class AbstractAdapter implements Interface {

    @Override
    public void fun1() {}

    @Override
    public void fun2() {}

    @Override
    public void fun3() {}

    @Override
    public void fun4() {}

    @Override
    public void fun5() {}

}
//缺省适配器的子类,只需要实现特定的抽象类的方法
public class AdapterImpl extends AbstractAdapter{
    
    @Override
    public void fun1(){
        System.out.println("fun1");
    }
}
//客户端
public class DefaultAdapterTest {

    public static void main(String[] args) {
        AdapterImpl adp = new AdapterImpl();
        adp.fun1();
    }

}

作者:qtlq
链接:juejin.cn/post/729081…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。