天天看点

大话设计模式-第17章 在NBA我需要翻译----适配器模式

第17章 在NBA我需要翻译----适配器模式

17.2 适配器模式

    适配器模式Adapter,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。例如电源适配器。

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

大话设计模式-第17章 在NBA我需要翻译----适配器模式

Target:用户希望的接口。目标可以是具体的或抽象的类,也可以是接口

class Target

{

    public virtual void Request()

    {

        Console.WriteLine(“普通请求!用户希望的接口。”);

    }

}

Adaptee(需要适配的类)代码如下:

class Adaptee

{

    public void SpecificRequest

    {

        Console.WriteLine(“特殊请求!需要配适配得类。”);

    }

}

Adapter(通过在内部包含一个Adaptee对象,把原接口转换成目标接口)代码如下:

class Adapter : Target

{

    private Adaptee adapter = new Adaptee();

    public override void Request()

    {

        adaptee.SpecificRequest();

    }

}

客户端代码:

static void Main(string[] args)

{

    Target target = new Adapter();

    target.Request();

    Console.Read();

}

17.3 何时使用适配器模式

    如果想使用一个已经存在的类,如果他的接口,也就是它的方法和你的要求不相同时,就应该考虑使用适配器模式。

两个类所做的事情相同或相似,但是具有不同的接口时要使用它。

    客户代码可以统一调用同一接口,可以更简单,更直接,更紧凑。

    还有就是在开发时,合并代码是,如果多方都不太容易修改的时候再使用适配器模式适配,但不要一有不同的时候就是用它。

再有,若公司打算使用第三方组件时,这个组件的接口与我们自己的系统接口不相同时,而我们完全没有必要为了迎合它而改动自己的接口。

17.4 篮球翻译适配器

//球员

abstract class Player

{

    protected string name;

    public Player(string name)

    {

        this.name = name;

    }

    public abstract void Attack();

    public abstract void Defense();

}

//后卫、中锋、前锋

//前锋

class Forwards : Player

{

    public Forwards(string name) : base(name)

    {

    }

    public override void Attack()

    {

        Console.WriteLine(“前锋(0)进攻”,name);

    }

    public override void Defense()

    {

        Console.WriteLine(“前锋(0)防守”,name);

    }

}

//中锋

class Center : Player

{

    //与前锋代码类似,略

}

//后卫

class Guards : Player

{

    //与前锋代码类似,略

}

客户端代码

static void Main(string[] args)

{

    Player b = new Forwards(“巴蒂尔”);

    b.Attack();

    Player m = new Guards(“YYY”);

    m.Attack();

    player ym = new Center(“姚明”);

    ym.Attack();

    ym.Defense();//注意此处姚明应该无法响应这些消息。

    Console.Read();

}

现添加外籍中锋类

class ForeignCenter

{

    private string name;

    public string Name

    {

        get { return name; }

        set { name = value;}

    }

    public void 进攻()

    {

        Console.WriteLine(“外籍中锋{0}进攻”,name);

    }

    public void 防守()

    {

        Console.WriteLine(“外籍中锋{0}防守”,name);

    }

}

//翻译者

class Translator : Player

{

    private ForeignCenter wjzf = new ForeignCenter();

    public Translator(string name) : base(name)

    {

        wjzf.Name = name;

    }

    public override void Attack()

    {

        wjzf.进攻();

    }

    public override void Defense()

    {

        wjzf.防守();

    }

}

客户端代码:

static void Main(string[] args)

{

    Player b = new Forwards(“巴蒂尔”);

    b.Attack();

    Player m = new Guards(“YYY”);

    m.Attack();

    player ym = new Translator(“姚明”);

    ym.Attack();

    ym.Defense();//注意此处姚明应该无法响应这些消息。

    Console.Read();

}

大话设计模式-第17章 在NBA我需要翻译----适配器模式

继续阅读