设计模式实践-访问者模式
场景
访问仪表对象和传感器对象
实现代码
访问者接口
namespace DesignPatterns.Visitor
{
/// <summary>
/// 访问者接口
/// </summary>
public interface IVisitor
{
/// <summary>
/// 访问仪表对象
/// </summary>
/// <param name="meter">仪表对象</param>
void Visit(Meter meter);
/// <summary>
/// 访问温度传感器对象
/// </summary>
/// <param name="tempSensor">温度传感器</param>
void Visit(TempSensor tempSensor);
/// <summary>
/// 访问压力传感器
/// </summary>
/// <param name="pressSensor">压力传感器</param>
void Visit(PressSensor pressSensor);
}
}
访问者实现
namespace DesignPatterns.Visitor
{
/// <summary>
/// 访问者模式
/// </summary>
public class Visitor : IVisitor
{
public void Visit(Meter meter)
{
Console.WriteLine($"获取仪表数据:{meter.GetData()}");
}
public void Visit(TempSensor tempSensor)
{
Console.WriteLine($"获取仪表数据:{tempSensor.GetData()}");
}
public void Visit(PressSensor pressSensor)
{
Console.WriteLine($"获取仪表数据:{pressSensor.GetData()}");
}
}
}
被访问对象接口
namespace DesignPatterns.Visitor
{
/// <summary>
/// 需要访问的对象接口
/// </summary>
public interface ISubject
{
/// <summary>
/// 接受访问者
/// </summary>
/// <param name="visitor">访问者对象</param>
void Accept(IVisitor visitor);
}
}
仪表对象
namespace DesignPatterns.Visitor
{
/// <summary>
/// 仪表对象
/// </summary>
public class Meter : ISubject
{
/// <summary>
/// 获取仪表数据
/// </summary>
/// <returns>仪表数据</returns>
public string GetData()
{
return "仪表数据";
}
/// <summary>
/// 接受访问者
/// </summary>
/// <param name="visitor">仪表访问者对象</param>
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
}
温度传感器对象
namespace DesignPatterns.Visitor
{
/// <summary>
/// 温度传感器类
/// </summary>
public class TempSensor : ISubject
{
/// <summary>
/// 获取温度
/// </summary>
/// <returns>温度数据</returns>
public string GetData()
{
return "温度";
}
/// <summary>
/// 接受访问者
/// </summary>
/// <param name="visitor">温度传感器访问者对象</param>
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
}
压力传感器对象
namespace DesignPatterns.Visitor
{
/// <summary>
/// 压力传感器类
/// </summary>
public class PressSensor : ISubject
{
/// <summary>
/// 获取压力值
/// </summary>
/// <returns>压力值</returns>
public string GetData()
{
return "压力";
}
/// <summary>
/// 访问者对象
/// </summary>
/// <param name="visitor">压力传感器访问者对象</param>
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
}
相关调用
Visitor.Meter meter = new Visitor.Meter();
Visitor.PressSensor pressSensor = new PressSensor();
Visitor.TempSensor tempSensor = new TempSensor();
IVisitor visitor = new Visitor.Visitor();
meter.Accept(visitor);
pressSensor.Accept(visitor);
tempSensor.Accept(visitor);
Out:
获取仪表数据:仪表数据
获取仪表数据:压力
获取仪表数据:温度