一、什么是适配器模式
适配器模式:
将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不谦容的类可以合作无间。
适配器模式主要角色:
- Target(目标抽象类): 目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类
- Adaptee(适配者类): 适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码
- Adapter(适配器类): 适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系
适配器模式分类:
- 对象适配器模式:在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体
- 类适配器模式: 这种适配器模式下,适配器继承自已实现的类(一般多重继承)
二、样例分析
假设你缺鸭子对象,想用火鸡对象来冒充,显然,因为火鸡的接口不同,不能公然拿来用,需要写个适配器来实现。
/**
* Target(目标抽象类)
*/
public interface Duck {
public void quack();
public void fly();
}
/**
* Target(目标实现类)
*/
public class MallardDuck implements Duck{
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I'm flying");
}
}
/**
* Adaptee(适配者抽象类)
*/
public interface Turkey {
public void gobble();
public void fly();
}
/**
* Adaptee(适配者实现类)
*/
public class WildTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}
/**
* Adapter(适配器类)
*/
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
turkey.fly();
}
}
/**
* 测试类
*/
public class DuckTestDrive {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe Duck says...");
testDuck(duck);
System.out.println("\nThe TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
三、优缺点
优点:
- 将目标类和适配者类解耦
- 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握
四、使用场景
- 想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式
五、类和对象适配器对比
类适配器模式是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系。由于对象适配器符合合成复用原则,所以它比类适配器模式更加灵活。
结尾
- 感谢大家的耐心阅读,如有建议请私信或评论留言。
- 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步