现在的位置: 首页 > 综合 > 正文

小鸟初学设计模式(五)适配器模式

2013年05月17日 ⁄ 综合 ⁄ 共 4028字 ⁄ 字号 评论关闭

     好吧,首先感谢各位对于小鸟的支持,让小鸟得以坚持到第五天了,今天我们继续一起学习新的设计模式--适配器模式(Adapter pattern);

    适配器模式听起来比较玄乎,其实在小鸟自己理解类似于一个转化器,什么叫转化器?就是把不同的东东转化为相同的东东。例如,记得小鸟以前上小学的时候生活在农村,那时候的农村电压很不稳定,不过呢小鸟家里还是有一台电视的,大家都知道,电器一般需要恒定的220V交流电才能很好的运行,那时候由于农村的电压不稳定,小鸟家的电视一会就自动关机,估计是电压太低了,一会又好了,电压这样忽上忽下的,搞得电视跟拍恐怖片一样,于是小鸟的家长就去买了一台所谓的“稳压器”。使用就是直接将电视的电源接到稳压器上,然后电视就稳定了,我一看原来稳压器每次输出的电流都是220V哦,那东西现在基本很难看到了,这得感谢党感谢人民啊。。。。

    其实那个稳压器就相当于今天我们讲的适配器,将不同的电压,转换成稳定的220V然后输出。

   现实编程可能会遇到各种问题,例如,你有一个系统,别人也有一个系统,某一天你们的老板和别人的老板谈的来,决定把你们的系统整合在一起,这下就悲剧了,我们拿着具体的一个类来讨论,假设你们有一个Student类,他们也有一个类似于这样的类叫OtherStudent,你们各自实现自己的接口,代码如下:

package cd.david.adapter;
/***
 *
 * 定义一个学生
 * */
public interface IStudent {
    public String getStudentName();
   
   
    public String getStudentPhone();
   
   
    public String getStudentNum();
}
*****************************************************

package cd.david.adapter;

public class Student implements IStudent {

 @Override
 public String getStudentName() {
  System.out.println("你好,我的名字叫做小明");
  return null;
 }

 @Override
 public String getStudentPhone() {
 //哈哈,四川人都知道这个电话号码
      System.out.println("你好,我的电话是9090960");
  return null;
 }

 @Override
 public String getStudentNum() {
  //好2的学号
  System.out.println("你好,我的学号是2012121212");
  return null;
 }

}

********************************************************************

package cd.david.adapter;

import java.util.Map;

public interface IOtherStudent {
 //难道一个人只有一个名字,或许有多个绰号呢
    public Map<String,String> getStudentNameMap();
   
    public Map<String,String> getStudentPhoneMap();
   
    public Map<String,String> getStudentNumMap();
}

***********************************************

package cd.david.adapter;

import java.util.HashMap;
import java.util.Map;

public class OtherStudent implements IOtherStudent {

 @Override
 public Map<String, String> getStudentNameMap() {
  Map<String,String> stuName = new HashMap<String,String>();
  stuName.put("stuName", "小花");//真是一个。。的名字
  return stuName;
 }

 @Override
 public Map<String, String> getStudentPhoneMap() {
  Map<String,String> stuPhone = new HashMap<String,String>();
  stuPhone.put("stuPhone", "123456");
  return stuPhone;
 }

 @Override
 public Map<String, String> getStudentNumMap() {
  Map<String,String> stuNum = new HashMap<String,String>();
  stuNum.put("stuNum", "2013131313");
  return stuNum;
 }

}

*********************************************************************************

你会悲剧的发现你们虽然信息差不多,但是类的结构完全不同,这时候你想怎样呢?全部搞了,按照你的来?那你会被改死在代码的路上的·········

这时聪明的前辈想到了,要不我们伪装一下,把别人的类变成我们可以直接访问的类?

于是乎,一个叫做StudentAdapter的类出现了:

package cd.david.adapter;

import java.util.Map;

public class StudentAdapter extends OtherStudent implements IStudent {
 
  private Map<String,String> nameMap = super.getStudentNameMap();
    
     private Map<String,String> phoneMap = super.getStudentPhoneMap();
    
     private Map<String,String> numMap = super.getStudentNumMap();
 

 @Override
 public String getStudentName() {
  String stuName = nameMap.get("stuName");
  return stuName;
 }

 @Override
 public String getStudentPhone() {
  String stuPhone = phoneMap.get("stuPhone");
  return stuPhone;
 }

 @Override
 public String getStudentNum() {
  String stuNum = numMap.get("stuNum");
  return stuNum;
 }
      
}

 

 

注意他继承的谁,实现的哪个接口···明显是你想伪装成谁就实现哪个接口啊,千万不要搞反了哦。

 

 

具体附上测试:

package cd.david.test.adapter;

import cd.david.adapter.IStudent;
import cd.david.adapter.Student;
import cd.david.adapter.StudentAdapter;

public class AdapterTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
       IStudent   xiaoming = new Student();
       xiaoming.getStudentName();
       xiaoming.getStudentPhone();
       xiaoming.getStudentNum();
      
      
      System.out.println("***********************************************");
       StudentAdapter  xiaohua = new StudentAdapter();
       System.out.println("姓名:"+xiaohua.getStudentName()+"电话:"+xiaohua.getStudentPhone()+"学号:"+xiaohua.getStudentNum());
 }

}

**********************************************************

测试结果为:

你好,我的名字叫做小明
你好,我的电话是9090960
你好,我的学号是2012121212
***********************************************
姓名:小花电话:123456学号:2013131313

 

*************************************************************

此处为类的适配器模式,还有一种叫做对象的适配器模式,对象的适配器相当简单,这里小鸟就不写出来了啊,有需要交流的童鞋,请留言哦,

这里小鸟大概提示一下,就是在StudentAdapter的地方改动一下就行了,将继承接口改成组合,Ok···明白的举手···谢谢大家的支持!

加油!那些和我一样处于笨鸟阶段的程序猿。。。。。。奋斗

 

【上篇】
【下篇】

抱歉!评论已关闭.