主页传送门:💁 传送
1.适配器模式定义
适配器模式(Strategy Pattern) 又叫做变压器模式,是一种常用的设计模式。其定义如下:
Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
即:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
其通用类图如下:
2.适配器模式的角色
在适配器模式中是涉及到三个角色:
- 目标(Target)角色:
这是客户端所期望的接口,它定义了客户端可以调用的方法。 - 源(Adaptee)角色:
这是客户端所需要的对象,但它的接口与目标接口不兼容。 - 适配器(Adapter)角色:
这个角色需要将一个被适配者的接口转换成目标接口的中间件。换句话说,适配器实现了目标接口,并持有一个被适配者的对象。
3.适配器模式实战案例
3.1.场景说明
用适配器模式(Adapter)模拟火箭队比赛,教练暂停时给后卫、中锋、前锋分配进攻和防守的方法。
3.2.关系类图
使用适配器模式来实现的结构图如下:
3.3.代码实现
抽象球员类
/**
* 抽象球员类
*/
public abstract class Player {
/**
* 球员名字
*/
protected String name;
public Player(String name) {
this.name = name;
}
/**
* 进攻方法
*/
public abstract void attack();
/**
* 防守方法
*/
public abstract void defense();
}
前锋
/**
* 前锋
*/
public class Forwards extends Player {
public Forwards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("前锋「0」进攻 " + name);
}
@Override
public void defense() {
System.out.println("前锋「0」防守 " + name);
}
}
中锋
/**
* 中锋
*/
public class Center extends Player {
public Center(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("中锋「0」进攻 " + name);
}
@Override
public void defense() {
System.out.println("中锋「0」防守 " + name);
}
}
后卫
/**
* 后卫
*/
public class Guards extends Player {
public Guards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println("后卫「0」进攻 " + name);
}
@Override
public void defense() {
System.out.println("后卫「0」防守 " + name);
}
}
外籍中锋
/**
* 外籍中锋
*/
public class ForeignCenter {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void attackForeign() {
System.out.println("外籍中锋「0」进攻 " + name);
}
public void defenseForeign() {
System.out.println("外籍中锋「0」防守 " + name);
}
}
翻译者
/**
* 翻译者
*/
public class Translator extends Player {
// 申明并实例化一个内部"外籍中锋"对象,表明翻译者与外籍球员有关联
private ForeignCenter foreignCenter = new ForeignCenter();
public Translator(String name) {
super(name);
}
/**
* 翻译者将"attack"翻译为"进攻"告诉外籍中锋
*/
@Override
public void attack() {
foreignCenter.attackForeign();
}
/**
* 翻译者将"defense"翻译为"防守"告诉外籍中锋
*/
@Override
public void defense() {
foreignCenter.defenseForeign();
}
}
客户端类
public class Client {
public static void main(String[] args) {
Player forwards = new Forwards("巴蒂尔");
forwards.attack();
Player center = new Center("科比");
center.attack();
Player guards = new Guards("詹姆斯");
guards.attack();
// 翻译者
Translator translator = new Translator("姚明");
translator.attack();
translator.defense();
}
}
4.适配器模式优缺点
适配器模式的优点主要包括:
- 提高类的透明性和复用,现有的类复用但不需要改变。
- 目标类和适配器类解耦,提高程序的扩展性。
- 在很多业务场景中符合开闭原则。
而适配器模式的缺点为:
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
5.适配器模式使用场景
适配器模式的使用场景包括:
- 需要使用一个已经存在的类,但其接口不符合需求时,可以使用适配器模式将该接口转换成客户端所期待的另一个接口,从而使原本因接口不兼容而无法一起工作的两个类能一起工作。
- 需要创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作时,可以使用适配器模式将该类和其他类进行适配,形成一个统一的输出接口,而输入类型不可预知(如Android中的Adapter)。
- 需要使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口时,可以使用适配器模式将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
6.适配器模式总结
适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户所期待的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
适配器模式有四种类型,包括类适配器模式、对象适配器模式、缺省适配器模式和双向适配器模式。类适配器模式通过继承目标抽象类实现目标接口,对象适配器模式通过实现目标接口维持对适配者的引用。缺省适配器模式选择性实现部分抽象方法,双向适配器模式在维持对目标类的引用同时也维持对适配者的引用。
总之,适配器模式是一种非常实用的设计模式,通过它可以将不兼容的接口转换成客户所期待的接口,使得不同的类可以协同工作。
如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
你的支持就是我✍️创作的动力! 💞💞💞