博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Adapter

Posted on 2009-04-10 17:13  夏虫  阅读(229)  评论(0编辑  收藏  举报


/*Adapter
 * Motivation
 * For the changing of the enviorment, we need adapt some object to the new enviroment
 * Intent
 *将一个类的接口转换成用户系统的另一个接口
 */

其实适配器就好像插盘和插头的组合,客户程序使用模块就象电网只人标准同一的插盘,你的电器是两个头的还是三个头的,或使用110v的或380v的电网不考虑,所以我们就写个东西(其实是为每个被调用模块写个东西),将其可以适应调用者的要求,而不用修改调用者,这里调用者可以是客户程序,也可以是大的系统,对他们的修改往往是不可能的或代价过高的。
    在适配器模式中有类适配器和对象适配器,有人说类适配器不好,当时我也这么认为了,可又看了其它的书,发现其实无论那种适配器,都是不好的,也都是好的,C#中的面向接口编程,以前觉得挺多余的,现在结合适配器想想,面向接口编程其实根本不是编程,我认为是可以说是面向规则管理。尤其是在对象适配器模式中,如果适配器继承与实体类而不是接口,当实体类的结构发生改变后,就有可能导致运行期错误(可能发生错误是书上说的,未实践,但听起来有道理)。同时基础与实体类,就往往依赖实体类的成员变量,而成员变量的含义是否发生改编,或其最初的定义是否和写适配器者的理解是一致的都很难保证。
class a{  //实体类
int _a;
}

class aadapter:a{
  void a{
     int b = _a;   //比如我们认为_a是整数,但其实定义者其实是把他但自然数处理的,而且以后没准又被定义成了ushort,而假如是继承于接口,接口里只有函数而已
  }
}

//适配器模式范例
 using System;
 using System.Collections;
 
 interface IStack
 {
  void push(object item);
  object pop();
  object peek();
 }
 class MyStack: IStack //适配器
 {
  //此时是为对象适配器,
  //c#中不建议使用类适配,类适配其实就是多继承
  ArrayList list; //被失败的对象,对ArrayList实现栈
  public MyStack()
  {
   list = new ArrayList();
  }
  public void push(object item)
  {
   list.Add(item);
  }
  public void pop()
  {
   return list.RemoveAt(list.Count - 1);
  }
  public void peek()
  {
   return list[list.Count - 1];
  }
 }
 /*这是适配器模式的典型用法,将某对象其实也可以认为是个不用你new的类,
  * 但软件的开发,模式应用的目的是要多快好省的写程序
  * 所以只要方向正确就行了
  * 比如 运算符 重载,其实他同样是适配器,但他是将被适配对象作为参数来适配的
  * 所以把握 模式的动机 和 开发的一般规律就可以了,而不用拘泥于形式
  * /

对象适配器:
 

类适配器:C#中不建议使用