适用场景
用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。
适配器简介
角色:
-
源类(Adaptee)角色:用户想要适用这个类,但是这个类中没有用户期望的sampleOperation2()方法。
-
目标(Target)角色(接口):该接口中有用户需要的sampleOperation2()方法。所以将源角色和目标角色做适配
-
适配器(Adaptor)角色:用户期待Adaptee类中有sampleOperation2()方法,所以将Adaptee和Target聚合
适配器分类适配器模式和对象适配器模式,还有一种非常少见的缺省适配模式
类适配模式
/**
* 类适配器模式
* 源角色:需要适配的类
* 客户期待sampleOperation2() 这个方法,但该类没有这个方法,所以要做适配器
*
* */
public class Adaptee {
public void sampleOperation1(){
System.out.println("样本操作1");
}
}
/**
* 类适配器模式
* 目标角色:该接口中有用户期待的方法sampleOperation2(),所以将源角色和目标角色做适配
* 注意:这里讨论的是类适配器模式,所以目标角色不可以是类
*
*
* */
public interface Target {
/**
* 这是源类(Adaptee)也有的方法
*
* */
void sampleOperation1();
/**
* 这是源类(Adaptee)没有的方法,也是用户期待的方法
*
* */
void sampleOperation2();
}
/**
* 类适配器模式
* 适配器角色:用户期待Adaptee中含有sampleOperation2()方法,
* 所以实现有该方法的Target接口
*
*
* */
public class Adaptor extends Adaptee implements Target{
/**
* 由于源类Adaptee中没有sampleOperation()方法
* 所以在适配器中补上此方法
*
* */
@Override
public void sampleOperation2() {
System.out.println("样本操作2");
}
}
注意:类适配模式中的目标角色必须是接口,适配器角色才能继承源类,实现目标类
对象适配器模式
public class Adaptee {
public void sampleOperation1(){
System.out.println("样本操作1");
}
}
public interface Target {
/**
* 这是源类(Adaptee)也有的方法
*
* */
void sampleOperation1();
/**
* 这是源类(Adaptee)没有的方法,也是用户期待的方法
*
* */
void sampleOperation2();
}
public class Adaptor implements Target{
private Adaptee adaptee;
public Adaptor(Adaptee adaptee){
this.adaptee=adaptee;
}
@Override
public void sampleOperation1() {
adaptee.sampleOperation1();
}
@Override
public void sampleOperation2() {
System.out.println("样本操作2");
}
}
注意:对象适配器模式中,是 适配器Adaptor 使用委派关系链接到Adaptee类。 使创建Adaptor的时候,需要创建一个Adaptee的对象作为入参,所以叫对象适配器模式。
缺省适配器模式
缺省适配器:接口中有很多方法,但是用户只想使用其中的某几个。。
可以用抽象类实现接口。将用户不需要的接口,实现为空,用户需要的接口,不实现,用Abstract修饰
/**
- 用户只想使用Target接口中的sampleOperation1方法
- 所以用适配器Adaptor将不需要的方法都实现了
- 把用户需要用的接口留给用户实现。
- */
/**
* 用户只想用接口中的sampleOperation1()
*
* */
public interface Target {
void sampleOperation1();
void sampleOperation2();
void sampleOperation3();
void sampleOperation4();
}
/**
* 实现用户不需要的接口
* 用户需要的接口,用abstract 抽象
*
*
* */
public abstract class Adaptor implements Target{
public abstract void sampleOperation1();
@Override
public void sampleOperation2() {
}
@Override
public void sampleOperation3() {
}
@Override
public void sampleOperation4() {
}
}
/**
* 用户只想使用Target接口中的sampleOperation1方法
* 所以用适配器Adaptor将不需要的方法都实现了
* 把用户需要用的接口留给用户实现。
*
* */
public class User extends Adaptor{
/**
* 用户自己实现
*
* */
@Override
public void sampleOperation1() {
System.out.println("11111111111");
}
}
出自:
https://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html