1. 适配器模式简介
适配器模式用于解决接口不兼容问题,将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。适配器模式主要分为两类:
类适配器模式:通过继承适配者类来实现适配。
对象适配器模式:通过组合适配者对象来实现适配。
2. 定义接口
在 Interfaces 文件夹中定义目标接口(Target)和需要适配的接口(Adaptee):
// IPlayer.cs - Target接口
public interface IPlayer
{
void Attack(); // 玩家角色攻击
void Move(); // 玩家角色移动
}
// Robot.cs - Adaptee类,来自第三方库,接口不兼容
public class Robot
{
public void FireWeapon()
{
Console.WriteLine("机器人发射武器!");
}
public void Walk()
{
Console.WriteLine("机器人行走!");
}
}
2.1 定义并理解IPlayer接口和Robot类的功能
2.1.1. IPlayer
接口的功能
IPlayer
接口定义了玩家角色的基本行为,包括攻击和移动。具体方法如下:
-
Attack()
:表示玩家角色执行攻击动作。 -
Move()
:表示玩家角色执行移动动作。
IPlayer
接口是目标接口,客户端代码期望通过调用 Attack()
和 Move()
来控制玩家角色的行为。
2.1.2 Robot
类的功能
Robot
类是一个需要适配的类,它来自第三方库,提供了机器人角色的行为,但与 IPlayer
接口不兼容。具体方法如下:
-
FireWeapon()
:表示机器人发射武器。 -
Walk()
:表示机器人行走。
Robot
类的功能与 IPlayer
接口的功能相似,但方法名称和行为实现不同。
2.1.3 不兼容的部分
IPlayer
接口和 Robot
类的功能虽然相似,但接口定义不一致,导致它们无法直接协同工作。具体不兼容的部分如下:
功能 | IPlayer 接口 |
Robot 类 |
不兼容的原因 |
---|---|---|---|
攻击行为 | Attack() |
FireWeapon() |
方法名称不同,IPlayer 期望调用 Attack() ,而 Robot 提供的是 FireWeapon() 。 |
移动行为 | Move() |
Walk() |
方法名称不同,IPlayer 期望调用 Move() ,而 Robot 提供的是 Walk() 。 |
2.1.4 不兼容的示例
假设客户端代码期望通过 IPlayer
接口控制角色行为:
IPlayer player = new Player(); // 假设Player是IPlayer的实现类
player.Attack(); // 期望执行攻击
player.Move(); // 期望执行移动
但如果我们直接使用 Robot
类:
Robot robot = new Robot();
r