1、准确定义:
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2、适用场景:
2.1、两个类所做的事情相似或者相近,但具有不同的接口时,要使用适配器模式。
2.2、通常在软件开发的后期或者维护期考虑使用。
2.3、如果在软件开发的初期就使用,那么通常是使用了第三方组件,而这个组件的接口和我们自己的系统接口不同。
3、UML图
4、例子:
4.1、场景:
在NBA比赛中,教练只使用英文对后卫、中锋、前锋进行指导,如果有一个不懂英文的后卫,则只能通过翻译的桥梁作用,来对教练对指导作出正确响应。在这个场景中,翻译官的角色就是适配器模式中的适配器。
4.2、UML图
4.3、code:
代码结构图如下:
代码如下:
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:31
* @ProjectName: JavaBaseTest
*/
public class AdapterForChinesePlayer extends Player {
private String name;
//适配器自然是知道自己应该为谁服务的,所以必须持有被服务者对象实例.
private ChineseGuardPlayer chineseGuardPlayer=new ChineseGuardPlayer();
AdapterForChinesePlayer(String name){
super();
this.name=name;
}
@Override
void attack(){
chineseGuardPlayer.gongJi(name);
}
@Override
void defend() {
chineseGuardPlayer.fangShou(name);
}
}
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:25
* @ProjectName: JavaBaseTest
*/
public class CenterPlayer extends Player {
private String name;
CenterPlayer(String name){
super();
this.name=name;
}
@Override
void attack() {
System.out.println("中锋"+name+"进攻");
}
@Override
void defend() {
System.out.println("中锋"+name+"防守");
}
}
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:28
* @ProjectName: JavaBaseTest
*/
public class ChineseGuardPlayer {
public void gongJi(String name){
System.out.println("后卫"+name+"攻击");
}
public void fangShou(String name){
System.out.println("后卫"+name+"防守");
}
}
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:36
* @ProjectName: JavaBaseTest
*/
public class Client{
public static void main(String[] args) {
//英国前锋
ForwardsPlayer fp=new ForwardsPlayer("乔治");
fp.attack();
fp.defend();
//英国中锋
CenterPlayer cp=new CenterPlayer("约翰");
cp.attack();
cp.defend();
//英国后卫
GuardPlayer gp=new GuardPlayer("布莱克");
gp.attack();
gp.defend();
//中国后卫
Player chinese=new AdapterForChinesePlayer("姚明");
chinese.attack();
chinese.defend();
}
}
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:19
* @ProjectName: JavaBaseTest
*/
public class ForwardsPlayer extends Player {
private String name;
ForwardsPlayer(String name){
super();
this.name=name;
}
@Override
void attack() {
System.out.println("前锋"+name+"进攻");
}
@Override
void defend() {
System.out.println("前锋"+name+"防守");
}
}
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:27
* @ProjectName: JavaBaseTest
*/
public class GuardPlayer extends Player {
private String name;
GuardPlayer(String name){
super();
this.name=name;
}
@Override
void attack() {
System.out.println("后卫"+name+"进攻");
}
@Override
void defend() {
System.out.println("后卫"+name+"防守");
}
}
package designmodel.seventeenthchapter;
/**
* @Author: cxh
* @CreateTime: 18/1/15 23:14
* @ProjectName: JavaBaseTest
*/
public abstract class Player{
private String name;
Player(){}
Player(String name){
this.name=name;
}
//进攻
abstract void attack();
//防守
abstract void defend();
}
参考书籍:《大话设计模式》-程杰