设计模式之适配器模式

来源:互联网 发布:天津广电网络客服电话 编辑:程序博客网 时间:2024/06/05 23:59

(各种设计模式的源代码在 https://github.com/mjnjust/Designmode.git ,使用utf8编码)
一、定义
将一个类的接口转换成期望的另外一种接口,从而使原来无法匹配的接口在一起工作。

二、实例
假如你在一个做XX系统的公司,这个公司对于XX系统有一套自己的框架,当有客户来的时候,你只要把客户所在公司的老系统
和你公司系统的框架对接上,这样就可以做出一个新系统了(这样的钱可真是好赚!我暑假实习的那家国内数一数二的运营商方案
提供商就是这么干的,我当时的师傅对那家公司的系统熟悉的不得了,做业务简直是嗖嗖的)。
在对接的时候一定会有很多无法匹配的情况,比如同样是对一个用户的描述,原来的系统使用的接口可能是这样:

public interface IOldUserInfo { String getName(); int getAge(); String getAddress(); int getWorkYears();}
定义成的类使这样:
public class OldUser implements IOldUserInfo{ private String name ; private int age ; private String  address ; private int workyears ; public OldUser(String name,int age,String address,int workyears) {  this.name = name ;  this.age = age ;  this.address =address ;  this.workyears = workyears; } @Override public String getName() {  return this.name; } @Override public int getAge() {  return this.age; } @Override public String getAddress() {  return this.address; } @Override public int getWorkYears() {  return this.workyears ; }}

但是在你所在公司的XX系统中对用户的定义是这样的:

//接口public interface INewUserInfo { String getUserName(); int getUserAge(); String getUserAddress(); int getWorkYears();}//类public class OldUser implements IOldUserInfo{ private String name ; private int age ; private String  address ; private int workyears ; public OldUser(String name,int age,String address,int workyears) {  this.name = name ;  this.age = age ;  this.address =address ;  this.workyears = workyears; } @Override public String getName() {  return this.name; } @Override public int getAge() {  return this.age; } @Override public String getAddress() {  return this.address; } @Override public int getWorkYears() {  return this.workyears ; }}

显然,两种类的参数名、函数名都不一样,那怎么让老系统的类可以适应新系统的类呢?在两者之间加一个适配器的类,继承了老系统的类,又实现了新系统的接口,这样不就行了。

public class Adapter extends OldUser implements INewUserInfo{ public Adapter(String name, int age, String address,int workyears) {  super(name, age, address,workyears); } @Override public String getUserName() {  return super.getName(); } @Override public int getUserAge() {  return super.getAge(); } @Override public String getUserAddress() {  return super.getAddress(); }}

测试代码:

INewUserInfo user1 = new Adapter("test", 21, "njust",0);  System.out.println("name:"+user1.getUserName());  System.out.println("age:"+user1.getUserAge());  System.out.println("address:"+user1.getUserAddress());

运行结果:

name:testage:21address:njust

2.2 适配器模式的本质
我觉得适配器模式的本质,就是将一个类或者接口的信息用另一个我们希望使用的接口表示出来。就像上面那个例子中,我们想要用OldUser类里面的数据,但是我通过一个Adapter将其中的信息用INewUserInfo接口表示了出来。

三、扩展
有时候我们要将好几个老接口的信息用一个新接口表示出来,怎么办呢?其实也很简单,用一个类将老接口聚集在一起,然后实现新的接口就行了。
具体例子见 Repository https://github.com/mjnjust/Designmode.git package6 。

0 0