结构型模式:将现有类或对象组织在一起形成更强大的结构
适配器模式
适配器模式定义
将一个接口转换为用户希望的另一个接口,可以使接口不兼容的类一起工作
适配器模式结构及实现
适配器模式结构
类适配器模式结构图
对象适配器模式结构图
适配器模式包含三个角色:
1、目标抽象类:定义客户端需要的接口,可以是接口,也可以是抽象类,由适配器类进行实现
2、适配器类:适配器模式的核心,其中实现了目标抽象类中定义的用户所需的方法,并在适配后对原有业务代码进行调用
3、适配者类:被适配的角色,是已经存在的接口,该接口不符合现在的需求,需要被适配,里面封装了真正的业务代码
适配器模式实现
1、类适配器
public class Adapter extends Adaptee implements Target{
super.specificRequest();
}
2、对象适配器(使用频率较高)
public class Adapter extends Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee){this.adaptee=adaptee;}
public void request(){
adaptee.specificRequest();
}
}
缺省适配器模式
当不需要实现一个接口的全部方法时,可以先定义一个抽象类给出接口所有方法的空实现,在使用该抽象类的子类时可以选择性覆盖需要使用的方法。该模式在java.awt.event中广泛使用。
双向适配器
在上面的对象适配器中,只包含了适配者类的引用,如果包含适配者类和目标类两者的引用,就可以在适配器中同时引用适配者和目标类,该适配器就是一个双向适配器。
实现代码如下:
public class Adapter implements Target,Adaptee{
private Target target;
private Adaptee adaptee;
public Adapter(Target target){this.target=target;}
public Adapter(Adaptee adaptee){this.adaptee=adaptee;}
public void request(){
adaptee.specificRequest();
}
public void specificRequest(){
target.request();
}
}
适配器优缺点
优点
共同的优点
1、将目标类和适配者类解耦,无需修改原有结构
2、提高了适配者的复用性
3、灵活性和扩展性非常好,可以在不修改原有代码的基础上增加新的适配器类
类适配器:
由于类适配器是适配者的子类,可以在类适配器中对适配者的方法做一些替换,增强了灵活性
对象适配器:
1、可以把多个不同的适配者适配到同一个目标
2、能够适配适配者的子类
缺点
类适配器
1、不支持多继承的语言一次只能适配一个适配者,
2、适配者不能为final
3、目标抽象类必须为接口
对象适配器
替换适配者中的方法比较困难,如果想替换适配者的方法,需要定义一个子类,在其中替换方法,将子类作为新的适配者进行适配
桥接模式
桥接模式简介
将抽象部分与其实现部分解耦,使两者能够独立变化
桥接模式结构与实现
桥接模式结构
桥接模式包含四个角色:
1、抽象类:用于定义事物抽象类型的接口,通常是抽象类,其中定义了一个实现类接口类型的对象并可以维护该对象,与实现类接口有关联关系。
2、扩充抽象类:实现在抽象类中定义的业务方法
3、实现类接口:定义实现类的接口,提供了被抽象类调用的基础操作
4、具体实现类:实现了实现类接口中定义的方法,提供不同的基本操作实现
抽象类:将具有两个独立变化维度的类的一些普通业务方法和与之关系最密切的维度设为抽象类(抽象部分)
实现类:将另一个维度设置为实现类层次结构
桥接模式实现
//实现类接口
public interfacce implementor{
public void operationImpl();
}
//抽象类接口
public abstruct class Abstraction{
private Implementor impl;
public void setImpl(Implementor impl){
this.impl=impl;
}
public abstract void operation();
}
//实现类接口子类
public class ConcreteImplementor implements Implementor{
public abstract void operation(){
//具体操作
}
}
//抽象类接口子类
public class RefinedAbstraction extends Abstraction{
public void operation(){
//调用impl中方法进行操作
}
}
将实体中独立变化的维度抽象出来,并以成员变量的形式将该维度注入实体中,进而调用维度操作。
桥接模式与适配器模式联用
使用适配器模式添加桥接模式中不被支持的api
桥接模式优缺点
桥接模式优点
1、分离抽象接口及实现部分,用关联关系解耦抽象和实现之间的绑定关系
2、桥接模式可以取代多重继承方案,减少类的数量
3、提高了系统的可扩展性,任意一个维度进行扩展都不需要修改原有系统
桥接模式缺点
1、增加了系统的设计与理解难度,关联关系建立在抽象层,所以要求一开始就针对抽象层进行设计
2、要求正确识别出系统中的两个独立变化的维度,因此使用有一定局限性,如何识别两个维度也需要一定的经验
桥接模式适用环境
1、如果系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次间建立继承关系,可以使用桥接模式
2、抽象部分和实现部分可以用继承的方式独立扩展,互不干扰。可以动态的将一个抽象化子类和一个实现类子类进行动态组合
3、类存在多个独立变化的维度,而且都需要独立进行扩展
4、不希望使用继承或不希望因为继承导致类的个数急速增加的系统