{C#}设计模式辨析.访问者

2021-08-12  本文已影响0人  码农猫爸

背景

示例

using static System.Console;

namespace DesignPattern_Visitor
{
    // 访问者接口,可执行所有被访类的功能
    public interface IVisitor
    {
        void PatCat(Cat cat); // 必须传参具体类
        void WalkDog(Dog dog);
    }

    // 具体访问者
    public class Visitor : IVisitor
    {
        private readonly string name;

        public Visitor(string name)
        {
            this.name = name;
        }

        public void PatCat(Cat cat) => cat.Pat(name);
        public void WalkDog(Dog dog) => dog.Walk(name);
    }

    // 被访类接口
    public interface IElement
    {
        void Accept(IVisitor visitor); // 运行时,执行访问动作
    }

    // 具体被访类,多个之间可无关联
    public class Cat : IElement
    {
        public void Accept(IVisitor visitor)
            => visitor.PatCat(this);

        public void Pat(string name)
            => WriteLine($"{name} is patting a cat.");
    }

    public class Dog : IElement
    {
        public void Accept(IVisitor visitor)
            => visitor.WalkDog(this);

        public void Walk(string name)
            => WriteLine($"{name} is walking a dog.");
    }

    class Program
    {
        static void Main(string[] args)
        {
            var visitor = new Visitor("Zhang");
            var cat = new Cat();
            cat.Accept(visitor);

            var dog = new Dog();
            dog.Accept(visitor);

            ReadKey();
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读