• 设计模式(第二十一式:访问者模式)


    概念:
      访问者模式:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the class of the elements on which it operations. 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

    实现:
      定义数据结构

        public class Computer {
            public Computer(CPU cpu,HardDisk hardDisk){
                this.cpu = cpu;
                this.hardDisk = hardDisk;
            }
    
            public void accept(ComputerVisitor visitor){
                cpu.accept(visitor);
                hardDisk.accept(visitor);
    
            }
    
            private CPU cpu;
            private HardDisk hardDisk;
    
            public CPU getCpu() {
                return cpu;
            }
    
            public void setCpu(CPU cpu) {
                this.cpu = cpu;
            }
    
            public HardDisk getHardDisk() {
                return hardDisk;
            }
    
            public void setHardDisk(HardDisk hardDisk) {
                this.hardDisk = hardDisk;
            }
        }


      抽象访问对象

        public abstract class Hardware {
            private String name;
    
            public Hardware(String name){
                this.name = name;
            }
    
            public void run(){
                System.out.println(this.name+"运行了");
            }
    
            public abstract void accept(ComputerVisitor visitor);
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }


      访问对象的具体实现

        public class CPU extends Hardware {
    
            public CPU(String name) {
                super(name);
            }
    
            @Override
            public void accept(ComputerVisitor visitor) {
                visitor.visitor(this);
            }
        }
        public class HardDisk extends Hardware {
    
            public HardDisk(String name){
                super(name);
            }
    
            @Override
            public void accept(ComputerVisitor visitor) {
                visitor.visitor(this);
            }
        }


      定义访问者接口

        public interface ComputerVisitor {
    
            void visitor(Hardware hardware);
        }


      访问者具体实现

        public class NameVisitor implements ComputerVisitor {
            @Override
            public void visitor(Hardware hardware) {
                System.out.println("访问者访问Name:" + hardware.getName());
            }
        }
        public class RunVisitor implements ComputerVisitor {
            @Override
            public void visitor(Hardware hardware) {
                hardware.run();
            }
        }


    分析:
      1.访问者模式可以将一组相关的访问封装在一起,对于新的属性或者行为可以比较容易的扩展访问者。
      2.访问者提供的访问方式不通过原数据结构,所以新增加原数据结构对象,导致新增加访问者对象较为复杂。
      3.适用场景:
        a.有一组固定的运行流程可以使用访问者对其封装。
        b.业务规则需要比便利多个不同对象的某些方法,也是可以用访问者模式封装。

  • 相关阅读:
    如何阅读论文(译)
    Linux运维小知识
    认识Linux分区
    如何获取离线安装Chrome扩展程序的包
    Centos 7.4 下初探Zabbix安装
    尝试在Linux上部署Asp.net Core应用程序
    Centos 7.3下图文安装SQL Server
    Asp.net MVC Razor常见问题及解决方法
    轻量级高性能ORM框架:Dapper高级玩法
    Asp.net MVC 如何对所有用户输入的字符串字段做Trim处理
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11134086.html
Copyright © 2020-2023  润新知