适配器模式:如何将一个方块放进一个圆洞中。
namespace 设计模式.适配器模式.目标接口(Target)
{
//鸭子的接口
public interface Duck
{
void quack();
void fly();
}
public class MallardDuck : Duck
{
public void quack()
{
//“嘎嘎嘎”
System.Windows.Forms.MessageBox.Show("Quack");
}
public void fly()
{
//"飞行一大段"
System.Windows.Forms.MessageBox.Show("I'm flying");
}
}
}
namespace 设计模式.适配器模式.需要适配的类(Adaptee)
{
//火鸡的接口
public interface Turkey
{
//咯咯叫
void gobble();
//飞行
void fly();
}
//野火鸡对象
public class WildTurkey : Turkey
{
public void gobble()
{
//“咯咯咯”
System.Windows.Forms.MessageBox.Show("Gobble gobble");
}
public void fly()
{
//“飞行一小段”
System.Windows.Forms.MessageBox.Show("I'm flying a short distance");
}
}
}
namespace 设计模式.适配器模式.适配器(Adapter)
{
//用火鸡实现鸭子的对象适配器
public class TurkeyAdapter : Duck
{
Turkey turkey;
//构造时可动态传入一种火鸡类(对象适配器的优点)
public TurkeyAdapter(Turkey turkey)
{
this.turkey = turkey;
}
//使用火鸡的叫声
public void quack()
{
turkey.gobble();
}
public void fly()
{
//假设火鸡飞行5次相当于鸭子飞行一次
for (int i = 0; i < 5; i++)
{
turkey.fly();
}
}
}
//用火鸡实现鸭子的类适配器
public class ClassAdapter : WildTurkey, Duck
{
//使用WildTurkey的"gobble()"方法实现
public void quack()
{
base.gobble();
}
//覆盖WildTurkey类中的"fly()"方法
new public void fly()
{
for (int i = 0; i < 5; i++)
{
base.fly();
}
}
}
}
总结:
1.对象适配器不仅可以适配某个类,也可以适配该类的任何子类;类适配器则不需要重新实现整个适配者,还可以覆盖被适配者的行为。
2.对象适配器弹性好,但相对的,他需要两个类配合工作;类适配器则仅仅需要一个适配器对象,但弹性较差。