适配器模式:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使原本由于接口不兼容而不能在一起工作的类可以一起工作.
开发按人员经常遇到这样的问题:比如一个开发小组a开发的系统中有一个A接口,该接口中有一个方法methodA(),并且已经有类实现了此接口,
即A接口可以回调实现A接口的类的methodA()方法,同时还有一个开发小组b开发的系统中有一个B接口,该接口中有个方法methodB(),并且已经有类实现了此接口,
即B接口可以回调实现B接口的类的methodB()方法.现在用户有了新的需求,希望通过A接口回调B接口的methodB()方法,面对这样的问题,不用担心,
适配器是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式,该模式中包含目标,被适配者和适配器.
适配器模式的关键是建立一个适配器,且这个适配器实现了目标接口并包含有被适配者的引用.
结合上面的问题,为了能在A接口变量回调B接口定义的方法,开发小组a在系统中添加了一个适配器AdapterA,AdpaterA实现了A接口,并包含有B接口的变量,
这样一来,A接口变量在回调AdapterA适配器实现了A接口的方法过程中,通过委托B接口变量回调B接口中的方法.
适配器模式结构中包括三个角色:
目标:目标是一个接口类,该接口是客户想使用的接口.
被适配者:被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要适配.
适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配器的职责是对被适配者(接口或抽象类)与目标接口进行适配.
应用场景一:
某用户有一个电视,并且都是插在二相插座上工作,现在用户又有了一个三相插座,并且想通过三相插座来使用电视,请提供解决方案.
开发按人员经常遇到这样的问题:比如一个开发小组a开发的系统中有一个A接口,该接口中有一个方法methodA(),并且已经有类实现了此接口,
即A接口可以回调实现A接口的类的methodA()方法,同时还有一个开发小组b开发的系统中有一个B接口,该接口中有个方法methodB(),并且已经有类实现了此接口,
即B接口可以回调实现B接口的类的methodB()方法.现在用户有了新的需求,希望通过A接口回调B接口的methodB()方法,面对这样的问题,不用担心,
适配器是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式,该模式中包含目标,被适配者和适配器.
适配器模式的关键是建立一个适配器,且这个适配器实现了目标接口并包含有被适配者的引用.
结合上面的问题,为了能在A接口变量回调B接口定义的方法,开发小组a在系统中添加了一个适配器AdapterA,AdpaterA实现了A接口,并包含有B接口的变量,
这样一来,A接口变量在回调AdapterA适配器实现了A接口的方法过程中,通过委托B接口变量回调B接口中的方法.
适配器模式结构中包括三个角色:
目标:目标是一个接口类,该接口是客户想使用的接口.
被适配者:被适配者是一个已经存在的接口或抽象类,这个接口或抽象类需要适配.
适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配器的职责是对被适配者(接口或抽象类)与目标接口进行适配.
应用场景一:
某用户有一个电视,并且都是插在二相插座上工作,现在用户又有了一个三相插座,并且想通过三相插座来使用电视,请提供解决方案.
1.被适配者,直接看代码Adaptee,AdapteeOne.
<span style="font-size:12px;">package com.ilucky.pattern.adapter.one;
/**
* @author IluckySi
* @date 20140622
* 模拟二相插座.
*/
public interface Adaptee {
public abstract void connectElectric();
}</span>
<pre name="code" class="java"><span style="font-size:12px;">package com.ilucky.pattern.adapter.one;
/**
* @author IluckySi
* @date 20140622
* 模拟电视机.
*/
public class AdapteeOne implements Adaptee {
public void connectElectric() {
System.out.println("电视机正在使用二相插座播放三国演义!");
}
}
</span>
2.目标:直接看代码Target,TargetOne.
<span style="font-size:12px;">package com.ilucky.pattern.adapter.one;
/**
* @author IluckySi
* 模拟三相插座.
*/
public interface Target {
public abstract void connectElectric();
}
</span>
<span style="font-size:12px;">package com.ilucky.pattern.adapter.one;
/**
* @author IluckySi
* @date 20140628
*/
public class TargetOne implements Target {
public void connectElectric() {
System.out.println("电视机正在使用三相插座播放三国演义!");
}
}</span>
3.适配器,直接看代码Adapter.
<span style="font-size:12px;">package com.ilucky.pattern.adapter.one;
/**
* @author IluckySi
* @date 20140622
*/
public class Adapter implements Target {
private Adaptee apdatee;
public Adapter(Adaptee adaptee) {
this.apdatee = adaptee;
}
public void connectElectric() {
apdatee.connectElectric();
}
}</span>
4.最后看测试类MainTest.<span style="font-size:12px;">package com.ilucky.pattern.adapter.one;
/**
* @author IluckySi
* @date 20140621
*/
public class MainTest {
public static void main(String[] args) {
//使用二相插座.
Adaptee adapteeOne = new AdapteeOne();
adapteeOne.connectElectric();
//使用三相插座.
Target targetOne = new TargetOne();
targetOne.connectElectric();
//适配三相插座.
Adapter adapterOne = new Adapter(adapteeOne);
adapterOne.connectElectric();
}
}
/**
输出结果:
电视机正在使用二相插座播放三国演义!
电视机正在使用三相插座播放三国演义!
电视机正在使用二相插座播放三国演义!
*/</span>