[工作中的设计模式]适配器模式adapter
一、模式解析
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如果使用新接口可能导致原来大面积的修改,那么可以考虑使用适配器模式将新的接口适配旧接口。
适配器接口比较简单,而且适配一词现实中用的也比较多,如电源适配器,都是一个道理,所以直接上代码
二、模式代码
1、原有接口
package adapter.patten;
public interface Target {
    public void request();
}
2、新的方法
package adapter.patten;
public class Adaptee {
    public void specificRequest(){
        System.out.println("我正在执行specific 方法");
    }
}
3、适配器
package adapter.patten;
public class Adapter implements Target {
    public Adaptee adaptee;
    public void request(){
        adaptee=new Adaptee();
        adaptee.specificRequest();
    }
}
4、客户端代码
package adapter.patten;
public class Client {
    public static void main(String[] args) {
        Target target=new Adapter();
        target.request();
    }
}
5、执行结果
我正在执行specific 方法
三、应用场景
在工作中遇到平台需要使用支付平台进行支付,可能存在情况是原来平台已经接入了支付宝支付,各种接口包括:支付、退货、查询、对账都已经开发完成,突然客户说想改为财付通支付方式,那么已经写好的代码均需要变化,此时就需要使用适配器进行转化。
四、场景代码
1、定义支付方式,调用此接口,可以完成支付
package adapter.example;
public interface IPay {
    public void pay();
}
2、支付宝支付流程编写
package adapter.example;
public class AliPay implements IPay {
    @Override
    public void pay() {
        System.out.println("通过支付宝进行支付");
    }
}
3、财付通提供的支付方式,接口与已经定义的不同
package adapter.example;
public class TenPay {
    public void tenPay(){
        System.out.println("通过财付通进行支付");
    }
}
4、编写适配器,进行转化
package adapter.example;
public class TenPayAdapter implements IPay {
    TenPay tenPay;
    @Override
    public void pay() {
        if(tenPay==null){
            tenPay=new TenPay();
        }
        tenPay.tenPay();
    }
}
5、客户端调用
package adapter.example;
public class Client {
    public static void main(String[] args) {
//        IPay pay=new AliPay();
        IPay pay=new TenPayAdapter();
        pay.pay();
    }
}
五、说明
1、适配器模式是当两种接口无法兼容的情况下采取的被动方式,如果可以通过设计,避免出现此种情况,那么应尽量少使用适配器模式
2、适配器模式可以完成对象的延迟创建,如TenPayAdapter 中,直到支付方法被调用,才生成TenPay的实例
[工作中的设计模式]适配器模式adapter的更多相关文章
- [工作中的设计模式]享元模式模式FlyWeight
		
一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...
 - [工作中的设计模式]原型模式prototype
		
一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...
 - [工作中的设计模式]解释器模式模式Interpreter
		
一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...
 - [工作中的设计模式]中介模式模式Mediator
		
一.模式解析 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介模式又叫调停者模式,他有如下特点: 1.有多个系统或者对 ...
 - [工作中的设计模式]责任链模式chain
		
一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...
 - [工作中的设计模式]迭代子模式Iterator
		
一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...
 - [工作中的设计模式]策略模式stategy
		
一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口 ...
 - 设计模式 - 适配器模式(adapter pattern) 具体解释
		
适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...
 - 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释
		
适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...
 
随机推荐
- 关于java中Double类型的运算精度问题
			
标题 在Java中实现浮点数的精确计算 AYellow(原作) 修改 关键字 Java 浮点数 精确计算 问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...
 - 【编程题目】求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case和条件语句
			
看到这个问题,第一个反应是真变态啊. 然后,直觉是不能用循环就只能用递归了.可递归怎么跳出来却遇到了麻烦, 我连goto语句都考虑了也没弄好. 后来想到一个非常NC的方法:查找表. 如果n限定一个比较 ...
 - python安装paramiko模块
			
一.简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...
 - 带你熟悉CSS浮动
			
一.概念理解 浮动:顾名思义先浮后动,浮动的对象会先漂浮起来,离开自己原来的位置(也就是所谓的脱离文档流),后动的意思是,它的后面的元素会向它原来的位置动起来. 二.注意事项 1.当元素有浮动属性时, ...
 - vs c++系统函数 计时器和暂停
			
在vs console下, 1 添加计时器 #include <Windows.h> double start = GetTickCount(); double end = GetTick ...
 - Rabbitmq实现负载均衡与消息持久化
			
Rabbitmq 是对AMQP协议的一种实现.使用范围也比较广泛,主要用于消息异步通讯. 一,默认情况下Rabbitmq使用轮询(round-robin)方式转发消息.为了较好实现负载,可以在消息 ...
 - 优化MyBatis配置文件中的配置
			
一.为实体类定义别名,简化sql映射xml文件中的引用 之前,我们在sql映射xml文件中的引用实体类时,需要写上实体类的全类名(包名+类名),如下: <!-- 创建用户(Create) --& ...
 - SQL exists( select 1 from
			
use UnlockIndustry select * from Info_Coordinate as A join Info_Employee on A.EmployeeId=Info_Employ ...
 - 设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)
			
一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. ...
 - Qt Designer 修改窗体大小改变控件位置
			
一.新建一个窗体 用qt designer 新建一个QWidget窗体, 在窗体中右键 选择布局, 发现布局是选择不了的,这个是因为窗体里面没有添加控件, 任意添加空间后便可选择 右键-- 布局-- ...