适配器模式实例(C#):
用Adapter模式设计一个仿生机器人:
要求机器人可以模拟各种动物行为,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样汪汪叫,像狗一样快跑,或者像鸟一样叽叽叫,像鸟一样快快飞,使用适配器模式进行系统设计。
类图:
说明:此类图有visual studio 2012 自动生成。由类图可见,首先实现的一个AnimalAdaptee的类,下面是两个字类,分别具体实现鸟和狗的Cry和Move方法。Robot是一个抽象类,具体的Adaptor类实RobotAdaptor类,它申明了一个私有的_myAdaptee字段,其类型为AnimalAdaptee。
由以上的实现,可以达到适配器模式和桥模式的效果,我们看到Adaptor中也没有具体的指定需要定制化的Adaptee,而是只维护了一个一类Adaptee的引用,这样可以使程序设计的可扩展性更强。
源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RobotAdaptor
{
//机器人类
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();
}
}
}
结果截图:
直观的关系图: