NET设计模式6--适配器模式(Adapter Pattern)
一. 适配器模式
适配器模式,是将一个类转换成客户期望的另外一个接口。Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作。
适配器模式的目的就是将类的接口转换成客户对象需要的接口,也就是说我们有一个可以满足我们需要的对象,但是它的接口却不是我们所期望的那样,而我们现在所需要的就是创建一个新的接口,让原本的接口能够满足我们的需要。就像是美国的电源是110V,中国是220V,美国电器来到中国用,必须要通过一个变压器(适配器)来把电流改成110V才能正常使用。
二 适配器的分析
1.客户期待的接口或者抽象类Target
/// <summary>
/// 客户期待的接口或者抽象类Target
/// </summary>
public abstract class Target
{
public abstract void Request();
}
/// 客户期待的接口或者抽象类Target
/// </summary>
public abstract class Target
{
public abstract void Request();
}
2.要适配的类Adaptee,也就是与期望调用接口不相符的类
代码
/// <summary>
/// 要适配的类Adaptee,也就是与期望调用接口不相符的类
/// </summary>
public class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("执行要适配类的特殊请求方法!");
}
}
/// 要适配的类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();
}
}
/// 适配器类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();
}
{
Target target = new Adapter();
target.Request();
Console.Read();
}
5运行结果
代码
/// <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();
}
}
/// 篮球运动员
/// </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();
}
ap.Attack();
AdapterPlayer ap1 = new Guards("麦克格雷迪");
ap1.Attack();
AdapterPlayer ap2 = new Translator("YaoMing");
ap2.Attack();
ap2.Defense();
Console.ReadKey();
}
3.运行结果
四 总结
适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式统一了不兼容对象的接口,使的原本由于接口不兼容而不能工作的那些类可以一起工作。

浙公网安备 33010602011771号