/*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#中不建议使用