设计模式实践-访问者模式

场景

访问仪表对象和传感器对象

实现代码

访问者接口

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:

获取仪表数据:仪表数据
获取仪表数据:压力
获取仪表数据:温度
posted @ 2016-08-04 21:49  4Thing  阅读(147)  评论(0编辑  收藏  举报