[工作中的设计模式]适配器模式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 ...
随机推荐
- 【leetcode】Binary Tree Zigzag Level Order Traversal (middle)
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- 【leetcode】Reverse Words in a String(hard)☆
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...
- java获得本机IP,名称等
import java.net.InetAddress; import java.net.UnknownHostException; public class GetLocalIP { public ...
- jsdoc文档
官网文档:http://usejsdoc.org/index.html一个比较全的jsdoc示例 /** * @fileoverview 文件上传队列列表显示和处理 * @author 水车 **/ ...
- python 获取控制台输入
python想从控制台获取输入的的函数有两个一个是raw_input,一个是input. 这两个函数的区别是input获取的时候会精确到类型,假设输入的是1,那么获取的就是int型的变量,如果想输入字 ...
- java annotation
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.an ...
- C#资源文件管理
1.右键项目点属性; 2.点资源项,添加资源下拉框的添加现在文件,如下图: 3.直接上代码获取并复制到指定文件夹下: private void button1_Click(object sender, ...
- Linux解决关闭终端后终止服务问题
可使用nohup. 具体使用方法,参见:http://zjking.blog.51cto.com/976858/1117828
- C#的索引器
using System; using System.Collections; using System.Collections.Generic; using System.IO; namespace ...
- 怎么把MVC的Controller拆分写到别的类库
以为很难…… 其实直接继承Controller 并且按MVC_Controllser规则命名. 然后网站项目引用该项目即可.