zoukankan      html  css  js  c++  java
  • 设计模式(第二十一式:访问者模式)

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

  • 相关阅读:
    01时间处理--02 指定日期--转成星期
    中文乱码处理
    判断js变量是否定义,
    安卓请求服务器js文件下载到本地,版本号不一致就下载
    a标签href跳转---传值---禁止单引号
    修改mysql配置文件,group_concat设置为最大.默认1024个字节字符串.多条json会超出
    GROUP_CONCAT()多条数据.拼接字符串 最大长度1024
    使用变量判断之前.务必先定义
    多种序列化器-指定类对象
    JsonHelper
  • 原文地址:https://www.cnblogs.com/ben-mario/p/11134086.html
Copyright © 2011-2022 走看看