适配器模式(Adapter Pattern)又称变压器模式或者包装模式:
定义:Convert the interface of a class into another interface clints expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces。(将一个类的接口编程客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)
通用类图:
Target目标角色:该角色定义其他类转换成我们期待的类或接口
Adaptee源角色:你想把谁变成目标角色,这个“谁”就是源角色
Adapter适配器角色:适配器的核心角色,其他两个角色都是已经存在的角色,而适配器角色需要新建立的,它的职责非常简单,就是通过继承或者类关联的方式把源角色转换成目标角色
优点
1、通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
2、 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3 、将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
4、 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点
对于对象适配器来说,更换适配器的实现过程比较复杂。
//机器人类
abstract public class Robot
{
abstract public void RobotCry();
abstract public void RobotMove();
abstract public void SetAdaptee(object Value); //这么申明带有一个参数的抽象方法。
}
//抽象的Adaptee
public class AnimalAdaptee
{
public virtual void Cry() { }
public virtual void Move() { }
}
//不同种类的动物
//狗
public class DogAdaptee : AnimalAdaptee
{
public override void Cry()
{
//base.Cry();
Console.WriteLine("这是狗叫:汪汪汪!");
}
public override void Move()
{
//base.Move();
Console.WriteLine("这是狗跳:跳跳跳!");
}
}
//鸟
public class BirdAdaptee : AnimalAdaptee
{
public override void Cry()
{
//base.Cry();
Console.WriteLine("这是鸟叫:叽叽叽!");
}
public override void Move()
{
//base.Move();
Console.WriteLine("这是鸟飞:快快飞!");
}
}
//适配器类Adaptor
public class RobotAdapptor : Robot
{
private AnimalAdaptee _myAdaptee;
public AnimalAdaptee MyAdaptee
{
get { return _myAdaptee; }
set { _myAdaptee = value; }
}
public override void SetAdaptee(Object Value)
{
_myAdaptee = (AnimalAdaptee)Value;
}
public override void RobotCry()
{
//throw new NotImplementedException();
if (_myAdaptee == null) _myAdaptee = new AnimalAdaptee();
_myAdaptee.Cry();
}
public override void RobotMove()
{
//throw new NotImplementedException();
if (_myAdaptee == null) _myAdaptee = new AnimalAdaptee();
_myAdaptee.Move();
}
}
class Program
{
static void Main(string[] args)
{
Robot MyRobot = new RobotAdapptor();
AnimalAdaptee dogAdaptee = new DogAdaptee();
MyRobot.SetAdaptee(dogAdaptee);
MyRobot.RobotCry();
MyRobot.RobotMove();
//申明为第二种鸟类
AnimalAdaptee birdAdaptee=new BirdAdaptee();
MyRobot.SetAdaptee(birdAdaptee);
MyRobot.RobotCry();
MyRobot.RobotMove();
Console.ReadKey();
}
}
好了,这一章就写到这,欢迎大家加入QQ群:280993838 。或者关注我的公众号: