适配器模式是一种结构型设计模式,它允许不兼容的接口之间能够相互合作。这种模式涉及到一个单独的类,它负责加入独立的或不兼容的接口功能。简单来说,适配器模式就是一个中间件,它使得原本由于接口不兼容而不能一起工作的类可以一起工作。
适配器模式通常应用于以下情况:
想象一下,我们有一个IUSPowerSource
美国电源接口,它提供110V电压,而我们有一个设备是IEUPowerDevice
欧洲设备,它需要220V电压。为了让这个设备在美国使用,我们需要一个适配器。
首先,我们定义两个接口:
C#public interface IUSPowerSource
{
int Provide110V();
}
public interface IEUPowerDevice
{
void PowerOn(int voltage);
}
两个类
C#public class EUPowerDevice : IEUPowerDevice
{
public void PowerOn(int voltage)
{
MessageBox.Show(voltage.ToString());
}
}
public class USPowerSource : IUSPowerSource
{
public int Provide110V()
{
return 110;
}
}
然后,我们实现一个适配器:
C#public class PowerAdapter: IUSPowerSource
{
private IEUPowerDevice _device;
public PowerAdapter(IEUPowerDevice device)
{
_device = device;
}
public int Provide110V()
{
// 适配器逻辑,将110V转换为220V
int voltage110 = 110;
int voltage220 = Convert110VTo220V(voltage110);
_device.PowerOn(voltage220);
return voltage110;
}
private int Convert110VTo220V(int voltage110)
{
// 假设这里有复杂的转换逻辑
return voltage110 * 2;
}
}
最后,使用适配器让欧洲设备在美国电源上工作:
C#private void btnConvert_Click(object sender, EventArgs e)
{
IEUPowerDevice europeanDevice = new EUPowerDevice();
IUSPowerSource adapter = new PowerAdapter(europeanDevice);
var ret = adapter.Provide110V(); // 设备可以在110V电源上工作了
}
假设你有一个老旧的日志系统,它只支持输出日志到控制台,但是现在需要将日志输出到文件中。我们可以通过适配器模式来实现这一需求,而不是修改原有的日志系统。
首先,定义日志接口:
C#public interface ILogger
{
void Log(string message);
}
旧的日志系统实现:
C#public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine("Log to console: " + message);
}
}
现在,我们需要一个适配器来实现文件日志功能:
C#public class FileLoggerAdapter : ILogger
{
private FileLogger _fileLogger;
public FileLoggerAdapter(FileLogger fileLogger)
{
_fileLogger = fileLogger;
}
public void Log(string message)
{
_fileLogger.WriteToFile(message);
}
}
public class FileLogger
{
public void WriteToFile(string message)
{
// 实现将消息写入文件的逻辑
}
}
使用适配器输出日志到文件:
C#ILogger logger = new FileLoggerAdapter(new FileLogger());
logger.Log("This is a log message."); // 现在日志被写入到文件中
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!