适配器模式,将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
那么何时使用适配器模式呢,一般在项目后期维护时,一些已有的不可更改或很难更改的类,需要使用其他的类的接口,那么就可以根据需求创建一个适配器。
看看适配器的UML类图
基本得逻辑代码
class Target{
public void Request(){
//普通的请求
}
}
class Adapter extends Target{
private Adaptee a = new Adaptee();
@Override
public void Request(){
a.Request();//客户端真实的需求
}
}
class Adaptee {
public void Request(){
//客户端真实的需求
}
}
客户端
static void main(String[] args){
Target t = new Adapter();
t.Request();//实际调用的是Adaptee的方法
}
适配器模式就是这样简单,是前辈们给我们总结的用来维护一些难以维护的代码的方法。举个例子,一个程序猿去国外工作,技术够硬,但是英语水平不够,有个紧急项目需要他上手,但是沟通有障碍,不可能让他立刻学英语,也不可能让国外的工作者立刻学中文。那么就需要一个翻译,这个翻译就是一个适配者的角色。这里顺便使用一下建造者模式创建程序猿对象。
程序猿类
<pre name="code" class="java">package com.abings.adaptermodel.Builder;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class Progremer {
private String contry;
private String meaning;
public String getMeaning() {
return meaning;
}
public void setMeaning(String meaning) {
this.meaning = meaning;
}
public String getContry() {
return contry;
}
public void setContry(String contry) {
this.contry = contry;
}
}
抽象的建造者
package com.abings.adaptermodel.Builder;
/**
* Created by HaomingXu on 2016/9/12.
*/
public abstract class Builder {
public abstract void setContry();
public abstract Progremer getProgremer();
}
美国程序猿和中国程序猿
package com.abings.adaptermodel.Builder;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class CN_Progremer extends Builder{
private Progremer progremer = new Progremer();
@Override
public void setContry() {
progremer.setContry("中国程序猿");
}
@Override
public Progremer getProgremer() {
return progremer;
}
}
package com.abings.adaptermodel.Builder;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class AC_Progremer extends Builder{
private Progremer progremer = new Progremer();
@Override
public void setContry() {
progremer.setContry("美国程序猿");
}
@Override
public Progremer getProgremer() {
return progremer;
}
}
指挥者
package com.abings.adaptermodel.Builder;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class Director {
public static Progremer createProgremer(Builder builder){
builder.setContry();
return builder.getProgremer();
}
}
在看看适配器模式,Target是美国程序猿想对中国程序猿说的意思。
package com.abings.adaptermodel.Adapter;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class Target {
public String writeprogram(String english){
return english;
}
}
package com.abings.adaptermodel.Adapter;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class Adaptee {
public String writeprogram(String english){
return "嘿!兄弟,该写程序了!";
}
}
Adaptee是中国程序猿经过翻译得到的信息。中间还有个翻译的适配者
package com.abings.adaptermodel.Adapter;
/**
* Created by HaomingXu on 2016/9/12.
*/
public class Adapter extends Target {
private Adaptee adaptee = new Adaptee();
@Override
public String writeprogram(String english) {
return adaptee.writeprogram(english);
}
}
最后看看客户端代码
<pre name="code" class="java">package com.abings.adaptermodel;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.abings.adaptermodel.Adapter.Adapter;
import com.abings.adaptermodel.Adapter.Target;
import com.abings.adaptermodel.Builder.AC_Progremer;
import com.abings.adaptermodel.Builder.CN_Progremer;
import com.abings.adaptermodel.Builder.Director;
import com.abings.adaptermodel.Builder.Progremer;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过建造者模式,创建程序猿
Progremer AC_progremer = Director.createProgremer(new AC_Progremer());
Progremer CN_progremer = Director.createProgremer(new CN_Progremer());
//美国程序猿说
AC_progremer.setMeaning("hey!gay,write program!");
//创建一个Target,也就是美国程序猿的需求
Target target = new Adapter();
//通过翻译者,翻译给中国程序猿
String cn_target = target.writeprogram(AC_progremer.getMeaning());
//中国程序猿的理解
CN_progremer.setMeaning(cn_target);
Log.i("Tag","美国程序猿说:"+cn_target);
}
}
最后附上git:
https://github.com/SingleShu/AdapterModel