访问者模式

来源:互联网 发布:淘宝店铺经营地址海外 编辑:程序博客网 时间:2024/05/02 00:15

1.说明

namespace VisitorsPattern
{
    /*访问者模式:有个操作状态,作用于某个对象结构中的各个元素,
     * 此模式可以在不改变各个类的情况下去实施操作
     */

    /// <summary>
    /// 用于获取对象状态
    /// </summary>
    public abstract class Action
    {
        public abstract void GetRedChessState(RedChess redChess);
        public abstract void GetBlackChessState(BlackChess blackChess);
    }

    /// <summary>
    /// 象棋类
    /// </summary>
    public abstract class Chess
    {
        public abstract void GetAction(Action action);
    }

    public class RedChess : Chess
    {
        public override void GetAction(Action action)
        {
            action.GetRedChessState(this);
        }
    }

    public class BlackChess : Chess
    {
        public override void GetAction(Action action)
        {
            action.GetBlackChessState(this);
        }
    }

    /// <summary>
    /// 在赢的情况下的状态
    /// </summary>
    public class Win : Action
    {
        public override void GetRedChessState(RedChess redChess)
        {
            Console.WriteLine("{0} {1}", redChess.GetType().Name,this.GetType().Name);
        }

        public override void GetBlackChessState(BlackChess blackChess)
        {
            Console.WriteLine("{0} {1}", blackChess.GetType().Name, this.GetType().Name);
        }
    }

    /// <summary>
    /// 在输的情况下的状态
    /// </summary>
    public class Lose : Action
    {
        public override void GetRedChessState(RedChess redChess)
        {
            Console.WriteLine("{0} {1}", redChess.GetType().Name, this.GetType().Name);
        }

        public override void GetBlackChessState(BlackChess blackChess)
        {
            Console.WriteLine("{0} {1}", blackChess.GetType().Name, this.GetType().Name);
        }
    }

    /// <summary>
    /// 对象结构:用于集中管理各个对象,并实施对其影响
    /// </summary>
    public class ObjectStructure
    {
        private IList<Chess> chessList = new List<Chess>();
        public void Add(Chess chess)
        {
            chessList.Add(chess);
        }
        public void Remove(Chess chess)
        {
            chessList.Remove(chess);
        }
        public void DisPlay(Action action)
        {
            foreach (var tmp in chessList)
                tmp.GetAction(action);
        }
    }
}

 

2.调用

       static void Main(string[] args)
        {
            ObjectStructure o = new ObjectStructure();
            o.Add(new RedChess());
            o.Add(new BlackChess());

            Win w = new Win();
            o.DisPlay(w);
        }