zoukankan      html  css  js  c++  java
  • 设计模式系列

    访问者模式通过使用一个访问者类,是主业务改变执行算法

    介绍

    访问者模式属于行为型模式,通过依据不同的访问者来动态调整访问方式,将数据结构和数据操作进行分离,符合单一职责原则,扩展性较好。

    类图描述

    代码实现

    1、定义组件接口

    public interface IComputerPart
    {
        void Accept(ComputerPartVisitor computerPartVisitor);
    }
    

    2、定义访问者

    public class Keyboard : IComputerPart
    {
        public void Accept(ComputerPartVisitor computerPartVisitor)
        {
            computerPartVisitor.Visit(this);
        }
    }
    
    public class Monitor : IComputerPart
    {
        public void Accept(ComputerPartVisitor computerPartVisitor)
        {
            computerPartVisitor.Visit(this);
        }
    }
    
    public class Mouse : IComputerPart
    {
        public void Accept(ComputerPartVisitor computerPartVisitor)
        {
            computerPartVisitor.Visit(this);
        }
    }
    
    public class Computer : IComputerPart
    {
        readonly IComputerPart[] parts;
        public Computer() => parts = new IComputerPart[] { new Mouse(), new Keyboard(), new Monitor() };
    
        public void Accept(ComputerPartVisitor computerPartVisitor)
        {
            for (int i = 0; i < parts.Length; i++)
            {
                parts[i].Accept(computerPartVisitor);
            }
            computerPartVisitor.Visit(this);
        }
    }
    

    3、定义抽象访问者

    public abstract class ComputerPartVisitor
    {
        public abstract void Visit(Computer computer);
        public abstract void Visit(Mouse mouse);
        public abstract void Visit(Keyboard keyboard);
        public abstract void Visit(Monitor monitor);
    }
    

    4、实现访问者

    public class ComputerPartDisplayVisitor : ComputerPartVisitor
    {
        public override void Visit(Computer computer)
        {
            Console.WriteLine("Displaying computer");
        }
    
        public override void Visit(Mouse mouse)
        {
            Console.WriteLine("Displaying mouse");
        }
    
        public override void Visit(Keyboard keyboard)
        {
            Console.WriteLine("Displaying keyboard");
        }
    
        public override void Visit(Monitor monitor)
        {
            Console.WriteLine("Displaying monitor");
        }
    }
    

    5、上层调用

    class Program
    {
        static void Main(string[] args)
        {
            IComputerPart computer = new Computer();
            computer.Accept(new ComputerPartDisplayVisitor());
            Console.ReadKey();
        }
    }
    

    总结

    访问者模式对访问功能进行统一管理,通过再被访问者的类中加几个对外提供接待访问者的接口,从而改变具体访问者的执行方式。

  • 相关阅读:
    MySQL数据库分区修改【原创】
    浅谈测试rhel7新功能时的感受及遇到的问题【转载】
    htop安装步骤【原创】
    Shell脚本,自动化发布tomcat项目【转】
    shell编程之服务脚本编写,文件锁以及信号捕获
    如何清除jboss缓存
    device-mapper: multipath: Failing path recovery【转载】
    ajax 设置Access-Control-Allow-Origin实现跨域访问
    HTML5中Access-Control-Allow-Origin解决跨域问题
    深入理解JavaScript系列(结局篇)
  • 原文地址:https://www.cnblogs.com/hippieZhou/p/10171064.html
Copyright © 2011-2022 走看看