简单易懂,适配器就是一个转换接口,将两个不能相互兼容的类变成可以兼容。设计模式中的例子用的是翻译官,形象生动。将听不懂外语的中国球员分配一个翻译官,这样他就可以听得懂外语,可以正常的工作了。
可见,适配器也是单独的一个类。工作流程:翻译官(适配器类)将英语转换成汉语告诉中国球员(需要转换的类),中国球员开始打球。
具体代码如下,然后进行分析。
抽象球员类:
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 Guards:Player//后卫类
{
public Guards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("后卫{0}进攻", name);
}
public override void Defense()
{
Console.WriteLine("后卫{{0}防守", name);
}
}
外籍球员类,是单独的一个类,并不继承球员类。
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.防守();
}
}
客户端
class Program
{
static void Main(string[] args)
{
Player b = new Forwards("小明");
b.Attack();
Player m = new Guards("小红");
m.Attack();
Player ym = new Translator("姚明");//翻译者告诉姚明要进攻和防守
ym.Attack();
ym.Defense();
Console.Read();
}
}
分析:
上面的两种里式转换就不分析了,主要介绍下面的外籍球员:
1、下面的代码将“姚明”先传给了Player类,又因为Translator是继承了Player父类的构造方法,所以通过代码又将“姚明”给了Translator中的Name。(在这一步之前,Translator类中声明了外籍球员类)
Player ym = new Translator("姚明")
2、调用Translator类中的方法,Translator类中的方法就是调用外籍球员类的方法。也就是告诉外籍球员怎么做。