NET设计模式6--适配器模式(Adapter Pattern)

一. 适配器模式

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

  适配器模式的目的就是将类的接口转换成客户对象需要的接口,也就是说我们有一个可以满足我们需要的对象,但是它的接口却不是我们所期望的那样,而我们现在所需要的就是创建一个新的接口,让原本的接口能够满足我们的需要。就像是美国的电源是110V,中国是220V,美国电器来到中国用,必须要通过一个变压器(适配器)来把电流改成110V才能正常使用。

二 适配器的分析

  1.客户期待的接口或者抽象类Target

    /// <summary>
    
/// 客户期待的接口或者抽象类Target
    
/// </summary>
    public abstract class Target
    {
        
public abstract void Request();
    }

 

  2.要适配的类Adaptee,也就是与期望调用接口不相符的类  

代码
    /// <summary>
    
/// 要适配的类Adaptee,也就是与期望调用接口不相符的类
    
/// </summary>
    public class Adaptee
    {
        
public void SpecificRequest()
        {
            Console.WriteLine(
"执行要适配类的特殊请求方法!");
        }
    }

 

  3 适配器类Adapter把源接口转换成目标接口,包括变量adaptee

  

代码
    /// <summary>
    
/// 适配器类Adapter,把源接口转换成目标接口,包括变量adaptee
    
/// </summary>
    public class Adapter : Target
    {
        
public Adapter()
        {
            Console.WriteLine(
"构造函数。。。");
        }

        
private Adaptee adaptee;
        
public override void Request()
        {
            
if (adaptee == null)
            {
                adaptee 
= new Adaptee();
            }

            adaptee.SpecificRequest();
        }
    }

 

  4 客户端代码

  

static void Main(string[] args)
{

    Target target 
= new Adapter();

    target.Request();

    Console.Read();

}

 

 

  5运行结果

 

  三 适配器事例

  1.一个基类AdapterPlayer,包含进攻和防守。不同位置都有不同的实现。但是最终大家都适配到了AdapterPlayer

  2.程序

  

代码
/// <summary>
    
/// 篮球运动员
    
/// </summary>
    public abstract class AdapterPlayer
    {
        
protected string name;
        
public AdapterPlayer(string name)
        {
            
this.name = name;
        }
        
public abstract void Attack();
        
public abstract void Defense();
    }

    
/// <summary>
    
/// 前锋
    
/// </summary>
    public class Forwards : AdapterPlayer
    {
        
public Forwards(string name)
            : 
base(name)
        { }

        
public override void Attack()
        {
            Console.WriteLine(
"前锋 {0} 进攻",name);
        }

        
public override void Defense()
        {
            Console.WriteLine(
"前锋 {0} 防守",name);
        }

    }

    
/// <summary>
    
/// 中锋
    
/// </summary>
    public class Center : AdapterPlayer
    {
        
public Center(string name):base(name)            
        { }

        
public override void Attack()
        {
            Console.WriteLine(
"中锋 {0} 进攻", name);
        }

        
public override void Defense()
        {
            Console.WriteLine(
"中锋 {0} 防守", name);
        }
    }

    
/// <summary>
    
/// 后卫
    
/// </summary>
    public class Guards : AdapterPlayer
    {
        
public Guards(string name)
            : 
base(name)
        { }

        
public override void Attack()
        {
            Console.WriteLine(
"后卫 {0} 进攻", name);
        }

        
public override void Defense()
        {
            Console.WriteLine(
"后卫 {0} 防守", name);
        }
    }

    
/// <summary>
    
/// 外籍中锋
    
/// </summary>
    public class ForeignCenter
    {
        
private string _name;
        
public string Name
        {
            
get
            {
                
return _name;
            }
            
set
            {
                _name 
= value;
            }
        }

        
public void FAttack()
        {
            Console.WriteLine(
"外籍中锋 {0} 进攻", Name);
        }

        
public void FDefense()
        {
            Console.WriteLine(
"外籍中锋 {0} 防守", Name);
        }

    }

    
/// <summary>
    
/// 翻译者
    
/// </summary>
    public class Translator : AdapterPlayer
    {
        
private ForeignCenter fc = new ForeignCenter();
        
public Translator(string name)
            : 
base(name)
        {
            fc.Name 
= name;
        }

        
public override void Attack()
        {
            fc.FAttack();
        }

        
public override void Defense()
        {
            fc.FDefense();
        }

    }

 

2. 客户端代码

 

代码
        static void Main(string[] args)
        {   
           AdapterPlayer ap = new Forwards("巴蒂尔");
            ap.Attack();

            AdapterPlayer ap1 
= new Guards("麦克格雷迪");
            ap1.Attack();

            AdapterPlayer ap2 
= new Translator("YaoMing");
            ap2.Attack();
            ap2.Defense();
            Console.ReadKey();
        }

 

  3.运行结果

  

四 总结 

  适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式统一了不兼容对象的接口,使的原本由于接口不兼容而不能工作的那些类可以一起工作。

posted @ 2010-09-21 11:46  Jasmines  阅读(196)  评论(0)    收藏  举报