适配器模式

[ Adapter ]


[
客户希望的接口 : 该接口里定义了一些列客户程序需要的方法 。
原先已有类 : 该类是准备复用的类 , 已经拥有 , 短时间内无法改变 。
适配器类 : 该类继承了客户希望的接口 ,用来把已有的类转换成客户希望的接口 , 类里面有一个 原先已有类 的引用实例 , 生命周期当前类一样 , 在实现的接口方法里 , 去调用原有类的方法 , 实现封装 。
]


[
类适配器: 当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。

对象适配器:对象适配器”通过组合除了满足“用户期待接口”还降低了代码间的不良耦合。在工作中推荐使用“对象适配”。

缺省适配器模式:  缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。
]


将一个类的接口转换成客户希望的另外一个接口 。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

注: 在双方都不太容易修改时 , 使用适配器模式

Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。

定义客户希望的接口
适配器继承客户希望的接口 , 适配器内部声明一个私有的需要被适配类的 引用
适配器实现继承接口的方法 , 在方法内部调用(转换)被适配类的方法
客户程序使用时 , 接口 引用自 适配器类 , 实现被适配类的转换



源码 :


// <summary>
// 球员接口 — 客户希望的接口
// </summary>
interface IPlayer
{


  // <summary>
  // 球员名称
  // </summary>
  string Names { get; set; }
  

  // <summary>
  // 球员进攻的方法
  // </summary>
  void Attack();
  

  // <summary>
  // 球员防守的方法
  // </summary>
  void Defense();
}



// <summary>
// 中锋
// </summary>
class Center : IPlayer
{
  private string _Names;
  public string Names
  {
    get
    {
      return _Names;
    }
    set
    {
      _Names = value;
    }
  }

  public void Attack()
  {
    Console.WriteLine("中锋 : {0} 开始进攻!", Names);
  }

  public void Defense()
  {
    Console.WriteLine("中锋 : {0} 开始防守!", Names);
  }
}



// <summary>
// 外籍中锋 — 需要进行适配的类
// </summary>
class ForeignCenter
{
  private string _Names;
  public string Names
  {
    get
    {
      return _Names;
    }
    set
    {
      _Names = value;
    }
  }

  public void ForeignAttack()
  {
    Console.WriteLine("外籍中锋 : {0} 开始进攻!", Names);
  }

  public void ForeignDefense()
  {
    Console.WriteLine("外籍中锋 : {0} 开始防守!", Names);
  }
}



// <summary>
// 翻译 — 适配器类 , 把 外籍中锋 适配成 客户需要的球员
// </summary>
class Translator : IPlayer 适配器继承客户希望的接口
{
  private ForeignCenter fc = new ForeignCenter();

  public string Names
  {
    get {
      return fc.Names;
    }
    set
    {
      fc.Names = value;
    }
  }

  public void Attack()
  {
    fc.ForeignAttack(); //在适配器里面调用需要被适配的类的方法
  }

  public void Defense()
  {
    fc.ForeignDefense();
  }
}



class Program
{
  static void Main(string[] args)
  {
    IPlayer center = new Center();
    center.Names = "美国牌中锋";
    center.Attack();
    center.Defense();

    IPlayer forwards = new Forwards();
    forwards.Names = "美国牌前锋锋";
    forwards.Attack();
    forwards.Defense();


    IPlayer fc = new Translator(); 适配 中国中锋
    fc.Names = "中国姚明";
    fc.Attack();
    fc.Defense();

    Console.Read();
  }
}

posted on 2012-02-21 13:01  多个马甲  阅读(165)  评论(0编辑  收藏  举报