博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之路-适配器模式
阅读量:4165 次
发布时间:2019-05-26

本文共 4126 字,大约阅读时间需要 13 分钟。

适配器模式,将一个类的接口转换成客户希望的另外一个接口,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的方法}
适配器模式就是这样简单,是前辈们给我们总结的用来维护一些难以维护的代码的方法。举个例子,一个程序猿去国外工作,技术够硬,但是英语水平不够,有个紧急项目需要他上手,但是沟通有障碍,不可能让他立刻学英语,也不可能让国外的工作者立刻学中文。那么就需要一个翻译,这个翻译就是一个适配者的角色。这里顺便使用一下建造者模式创建程序猿对象。

程序猿类

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);    }}
最后看看客户端代码

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: 

你可能感兴趣的文章
Linux-mmap映射物理内存到用户空间
查看>>
Ext4文件系统三种日志模式——journal、ordered、writeback
查看>>
Linux挂载ext4根文件系统为journal模式
查看>>
linux内核引导参数解析及添加
查看>>
长短期记忆人工神经网络(LSTM)及其tensorflow代码应用
查看>>
长短期记忆人工神经网络(LSTM)网络学习资料
查看>>
运行网络中搜寻到的python程序代码——以长短期记忆人工神经网络(lstm)python代码为例
查看>>
闪存文件系统(Flash File System)
查看>>
WinMIPS64工具进行MIPS指令集实验(一)
查看>>
WinMIPS64工具进行MIPS指令集实验(二)
查看>>
Linux上快速入门英特尔Optane DC Persistent Memory Module的配置与使用
查看>>
Intel Optane DC Persistent Memory Module (PMM)详解
查看>>
Ubuntu 18.04安装英特尔Optane DC Persistent Memory Module配置工具ipmctl
查看>>
NUMA架构下的CPU拓扑结构
查看>>
如何判断变量在内存中如何放置的?低位在前还是高位在前
查看>>
c语言中通过指针将数值赋值到制定内存地址
查看>>
64位与32位linux c开发时默认字节对齐值
查看>>
malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐)
查看>>
初始化时共享内存的key值和信号量初始化的key值可以一样
查看>>
linux创建线程之pthread_create
查看>>