大话设计模式-第17章 在NBA我需要翻译----适配器模式
2016-06-19 17:16
591 查看
第17章
在NBA我需要翻译----适配器模式
17.2 适配器模式
适配器模式Adapter,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。例如电源适配器。
在软件开发中,有时会出现系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是是控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
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();
}
在NBA我需要翻译----适配器模式
17.2 适配器模式
适配器模式Adapter,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一起工作。例如电源适配器。
在软件开发中,有时会出现系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是是控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
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();
}
相关文章推荐
- mysql备份、恢复之xtrabackup
- tar+gzip
- JavaSE学习53:细说多线程之内存可见性
- C#类详解
- 第一个618
- 值得mark的11个开源机器学习项目
- 排序算法总结(6)——快速排序
- 直接插入排序-JS代码实现
- Acdream 1416 Crazy Nim(简单博弈找规律)
- Linux0.11内核--fork进程分析
- 练习:C# -- 多态
- 运行python程序
- java对象与json对象间的相互转换
- nginx之root和alias两种命令的区别
- IndentationError:unindent does not match any outer indentation level
- 为什么在C++中需要虚函数
- margin:0 auto;失效的原因
- JAVA图书馆库存管理系统程序代码(管理系统+用户购买结账系统)
- 搜索引擎命令大全!
- 01.Java 集合 - 概述