有哪些结构型模式
1.适配器模式 2.桥接模式 3.组合模式 4.代理模式 5.装饰模式 6.外观模式 7.享元模式
由于学习难度较大 并且相对用途较少 本章不会讲解享元模式
接下来针对以上6种设计模式进行单独讲解
1 适配器模式
1.1 定义
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)
举个简单例子: 笔记本电源为20V,家庭用电为220V,两者本不兼容,通过充电器转换之后两者便可兼容,本例中充电器便是一个适配器
1.2 应用场景
系统需要使用一些现有的类,而这些类的接口(例如方法名)不符合系统的需要,甚至没有这些类的源代码,典型的应用比如spring中的各种Adapter
适配器模式可以将目标类和适配者类解耦。通过引入一个适配器类来重用现有的适配者类,无须修改原有结构
适配器模式可以把多个不同的适配者适配到同一个目标
1.3 UML图
从上面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…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。