大话设计模式之适配器模式

来源:互联网 发布:宽带网络那家好 编辑:程序博客网 时间:2024/04/28 13:26

适配器模式

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

 

    当我们发现系统的数据和行为都正确,但接口不符合时,我们应该考虑用适配器,目的使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

 

 

//这是客户所期待的接口,目标可以是具体或抽象的类,也可以是接口class Target{    public virtual void Request()    {        Console.WriteLine("普通工作请求");    }}; //需要适配的类class Adaptee{    public void SpecialRequest()    {        Console.WriteLine("特殊工作请求");    }}; //Adapter,通过内部包装一个Adapter对象,把源接口转换成目标接口class Adapter:Target{    private Adaptee ad = new Adaptee();     public override void Request()    {        ad.SpecialRequest();    }}; //客户端void main(){    Target t = new Adapter();    t.Request();                //这样一来,其实我们调用的是SpecialRequest}


 

 

 

什么时候使用适配器模式呢?

    当两个类所做的事情相同或者相似的时候,但是他们具备不同的接口,且双方都不太容易修改的时候,就要使用适配器模式

        这样一来,客户端就可以同一调用接口。

 

以下为一个例子,讲一个异国篮球运动员听不懂教练的指挥,从而需要一个翻译(适配器)的例子:

 

 

//运动员抽象类abstractclass Player{    protected string name;    public Player(string name)    {        this.name = name;    }     public abstract void Attack();    public abstract void Defense();}; //本国运动员Aclass PlayerA :Player{    public PlayerA(string name) :base(name)    {}     public override void Attack()    {        Console.WriteLine("攻击,{0}",name);    }     public override void Defense()    {        Console.WriteLine("防守,{0}",name);    }}; //异国运动员Bclass ForeignPlayer{    private string name;    public string Name    {        get{ return name; }        set{ name = value; }    }     public void AK()    {        Console.WriteLine("Attack{0}",name;    }     public void DF()    {        Console.WriteLine("Defend{0}",name);    }}; //异国运动员的翻译class Translator : Player{    private ForeignPlayer FP = new ForeignPlayer();     public Translator(string name) :base(name)    {        FP.Name = name;    }     public override void Attack()    {        FP.AK();    }     public override void Denfense()    {        FP.DF();    }}; void main(){    //当我们要指挥异国运动员时候,我们指挥翻译员    Player fp = new Translator("ABC");    fp.Attack();    fp.Defense();}


0 0
原创粉丝点击