策略模式
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。
策略模式包含以下几个核心角色:
**环境:**用来维护对策略对象的引用。它可以定义一个接口,让策略对象根据上下文数据来执行算法。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
**策略接口:**这是一个接口或者抽象类,定义了所有支持的算法的公共接口或共同的行为。
**具体策略:**实现策略接口的类,提供具体的算法实现。每个具体策略都是策略接口的一个子类,实现了其中的算法。
代码演示
public interface ILoggerStrategy
{
void Log(string message);
}
实现两种具体的策略,一种是将日志记录到控制台,另一种是将日志记录到文件:
public class ConsoleLogger : ILoggerStrategy
{
public void Log(string message)
{
Console.WriteLine("Console Logger: " + message);
}
}
public class FileLogger : ILoggerStrategy
{
public void Log(string message)
{
// 假设这里实现将消息写入文件的逻辑
// 为了示例简洁,这里仅输出到控制台
Console.WriteLine("File Logger: " + message);
}
}
该类维护对策略对象的引用,并允许客户端根据需要更换策略:
public class LoggerContext
{
private ILoggerStrategy _loggerStrategy;
public LoggerContext(ILoggerStrategy loggerStrategy)
{
_loggerStrategy = loggerStrategy;
}
public void SetLoggerStrategy(ILoggerStrategy loggerStrategy)
{
_loggerStrategy = loggerStrategy;
}
public void Log(string message)
{
_loggerStrategy.Log(message);
}
}
class Program
{
static void Main(string[] args)
{
LoggerContext logger = new LoggerContext(new ConsoleLogger());
logger.Log("This is a console log.");
// 在运行时改变策略
logger.SetLoggerStrategy(new FileLogger());
logger.Log("This is a file log.");
}
}