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

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

原文地址:https://www.cnblogs.com/ben-mario/p/11134086.html