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


    概念:
      访问者模式: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.业务规则需要比便利多个不同对象的某些方法,也是可以用访问者模式封装。

  • 相关阅读:
    【LeetCode】1248. 统计「优美子数组」
    【LeetCode】200. 岛屿数量
    【LeetCode】53. 最大子序和
    【剑指Offer】面试题42. 连续子数组的最大和
    【剑指Offer】面试题57. 和为s的两个数字
    【LeetCode】55. 跳跃游戏
    【LeetCode】56. 合并区间
    简历HTML网页版
    关于新建Eclipse新建一个WEB项目后创建一个jsp文件头部报错问题?
    jquery选择器 看这个链接吧!2017.6.2
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11134086.html
Copyright © 2020-2023  润新知