结构型模式有七种:
适配器模式
将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。适配器有两种形式类适配器和对象适配器
角色
1、目标角色Target:所期待得到的接口;
2、源角色Adaptee:需要适配的接口;
3、适配器Adapter角色:适配器类是本模式的核心,适配器把源接口转化成目标接口;
优缺点
优点:
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
类图:
类的适配器:
对象适配器:
类适配器代码:
/**
* 目标接口
* @author work
*
*/
public interface Target {
void operate1() ;
void operate2() ;
}
package com.sun.adapter.cx;
/*
* 元角色
*/
public class Adaptee {
public void operate1(){
System.out.println("...............Operate1");
}
}
package com.sun.adapter.cx;
/**
* 适配器
* @author work
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public void operate2() {
// TODO Auto-generated method stub
System.out.println("...............Operate2");
}
public static void main(String[] args) {
Target t = new Adapter();
t.operate1();
t.operate2();
}
}
对象适配器代码:
package com.sun.adapter.dxcx;
/**
* 目标接口
* @author work
*
*/
public interface Target {
void operate1() ;
void operate2() ;
}
/*
* 元角色
*/
public class Adaptee {
public void operate1(){
System.out.println("...............Operate1");
}
}
package com.sun.adapter.dxcx;
/**
* 适配器
* @author work
*
*/
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void operate2() {
System.out.println("...............Operate2");
}
@Override
public void operate1() {
adaptee.operate1();
}
public static void main(String[] args) {
Target t = new Adapter();
t.operate1();
t.operate2();
}
}
针对这两种实现方式,在实际的开发中,到底该如何选择使用哪一种呢?判断的标准主要有两个,
一个是 Adaptee 接口的个数,另一个是 Adaptee 和 ITarget 的契合程度。如果 Adaptee 接口并不多,那两种实现方式都可以。
如果 Adaptee 接口很多,而且 Adaptee 和 Target 接口定义大部分都相同,那我们推荐使用类适配器,因为 Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。
如果 Adaptee 接口很多,而且 Adaptee 和 Target 接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。
适配器模式是用来做适配,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。