C# 设计模式(23)访问者模式

访问者模式

1.倾斜可扩展性设计

2.消息处理

代码实现:

实体类:

namespace VisitorPattern
{
    public abstract class BaseAdult
    {
        public string Name { get; set; }

        public abstract void Quarrel(IVisitor visitor);
    }
    public class Woman:BaseAdult
    {
        public override void Quarrel(IVisitor visitor)
        {
            visitor.QuarrelWoman(this);
        }
    }
    public class Man:BaseAdult
    {
        public override void Quarrel(IVisitor visitor)
        {
            visitor.QuarrelMan(this);
        }
    }
}

访问者:

namespace VisitorPattern.Visitor
{
    public interface IVisitor
    {
        public void QuarrelMan(BaseAdult adult);
        public void QuarrelWoman(BaseAdult adult);
    }
    public class VisitorInLove:IVisitor
    {
        public void QuarrelMan(BaseAdult adult)
        {
            Console.WriteLine($"{adult.Name}知错就改.");
        }

        public void QuarrelWoman(BaseAdult adult)
        {
            Console.WriteLine($"{adult.Name}必须哄.");
        }
    }
    class VisitorAfterMarriage:IVisitor
    {
        public void QuarrelMan(BaseAdult adult)
        {
            Console.WriteLine($"{adult.Name}不说话.");
        }

        public void QuarrelWoman(BaseAdult adult)
        {
            Console.WriteLine($"{adult.Name}...");
        }
    }
}

代码调用:

    class Program
    {
        static void Main(string[] args)
        {
            List<BaseAdult> adults = new List<BaseAdult>()
            {
                new Woman()
                {
                    Name = "Girl"
                },
                new Man()
                {
                    Name = "Boy"
                }
            };

            Console.WriteLine("********谈恋爱吵架*******");
            IVisitor visitor1 = new VisitorInLove();
            foreach (var adult in adults)
            {
                adult.Quarrel(visitor1);
            }

            Console.WriteLine("********婚后吵架*********");
            IVisitor visitor2 = new VisitorAfterMarriage();
            foreach (var adult in adults)
            {
                adult.Quarrel(visitor2);
            }
        }
    }

结果:

原文地址:https://www.cnblogs.com/YourDirection/p/14105511.html