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

适配器模式

    将一个类的接口转换成用户希望的另一个接口。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();
};
 
//本国运动员A
class PlayerA :Player
{
    public PlayerA(string name) :base(name)
    {}
 
    public override void Attack()
    {
        Console.WriteLine("攻击,{0}",name);
    }
 
    public override void Defense()
    {
        Console.WriteLine("防守,{0}",name);
    }
};
 
//异国运动员B
class 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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值