目录
1.概念:
使一个类的接口转变为客户希望的另外一个接口,该模式使得那些原本因为接口不兼容而不能一起工作的类可以一起工作
理解:被适配的类的方法名和客户类的方法名不同但是其作用是一样的,也就是其方法干的活是相同或相似的,适配类的方法名和客户类相同(继承了客户类),且拿到了被适配类的引用,表面上是适配类在干活实际上是被适配的类在干活
2.适配器模式结构图
3.练习的例子
抽象运动员类:
/**
* 抽象运动员类
*/
@Data
abstract class Player {
private String name;
public Player(String name){
this.name = name;
}
//进攻
abstract void attack();
//防守
abstract void defense();
}
前锋类:
/**
* 前锋类
*/
public class Forwards extends Player{
public Forwards(String name) {
super(name);
}
@Override
void attack() {
System.out.println(getName() + "前锋进攻");
}
@Override
void defense() {
System.out.println(getName() + "前锋防守");
}
}
后卫类:
/**
* 后卫类
*/
public class guards extends Player{
public guards(String name) {
super(name);
}
@Override
void attack() {
System.out.println(getName() + "后卫进攻");
}
@Override
void defense() {
System.out.println(getName() + "后卫防守");
}
}
外籍中锋类:
/**
* 外籍中锋
*/
@Data
public class ForeignCenter {
private String name;
public void 进攻(){
System.out.println("外籍中锋" + getName() + "进攻!");
}
public void 防守(){
System.out.println("外籍中锋" + getName() + "防守!");
}
}
翻译者(适配类):
/**
* 翻译者来适配外籍中锋
*/
public class Translator extends Player{
//拿到外籍中锋的引用
private ForeignCenter foreignCenter = new ForeignCenter();
public Translator(String name) {
super(name);
foreignCenter.setName(name);
}
@Override
void attack() {
foreignCenter.进攻();
}
@Override
void defense() {
foreignCenter.防守();
}
}
测试类:
public class Test {
public static void main(String[] args) {
Player guards = new guards("麦克");
Player forwards = new Forwards("凯蒂");
Player translator = new Translator("姚明");
guards.attack();
forwards.attack();
translator.attack();
translator.defense();
}
}
控制台:
4.练习的代码结构图
5.总结
何时使用:想使用一个已经存在的类,但如果它的接口,也就是它的方法和要求类的接口(方法)不相同时,而且该类的接口和要求类的接口做的事应该是相同或相似的,此时应该考虑用适配器模式。
好处:客户代码可以统一调用同一接口,这样可以更简单、更直接、更紧凑。
注意:类和方法的命名应该有规范,最好前期就设计好,接口不相同时,首先不应该考虑用适配器,而是应该考虑通过重构统一接口,要在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用。