zoukankan      html  css  js  c++  java
  • 第二十三讲:访问者模式

    访问者设计模式是最难的设计模式.

    Object Structure:公园

    Element:是一个抽象,可以是一个接口或者是抽象类.是公园的每一个部分的抽象.

    Concrete Element:实际的元素角色.公园的A部分或者是公园的B部分.accept()接待人.

    Visitor:抽象的访问者.

    Concrete Visitor:清洁工A或者是清洁工B.visit()访问.


    对象角色结构Object Structure:Park

    Element:ParkElement.公园的每一部分的抽象.

    ConcreteElement:ParkA和ParkB.

    访问者:Visitor

    访问者的具体实现:清洁工AVisitor和清洁工BVisitorB.
    Park是用来接收访问者的,它里面没有任何输出的,是没有任何方法的实现的.

    输出是由访问者实现的,访问者是如何实现的就看它里面的visit()方法是如何实现的.


    public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.


    public class MainClass {
        public static void main(String[] args) {
            Park park =  new Park();
            park.setName("越秀公园");
            //清洁工A
            VisitorA visitorA = new VisitorA();
            
            
            
            park.accept(visitorA);
            //清洁工B
            VisitorB  visitorB = new VisitorB();
            park.accept(visitorB);
            
            VisitorManager visitorManager = new VisitorManager();
            park.accept(visitorManager);
        }
    
    }
    public class Park implements ParkElement {
        private  ParkA parkA;
        private  ParkB parkB;
        
       private String name;//假设公园是有名字的.
        
        
    
    
    
    
        public Park() {
            super();
            // TODO Auto-generated constructor stub
           this.parkA = new ParkA();
           this.parkB = new ParkB();
           parkA.setName("A");
           parkB.setName("B");
        }
    
    
    
    
    
    
    
    
        @Override
        public void accept(Visitor visitor) { 
            // TODO Auto-generated method stub
            visitor.visit(this);//把Park传入进去
            parkA.accept(visitor);
            parkB.accept(visitor);
        }
    
    
    
    
    
    
    
    
        public String getName() {
            return name;
        }
    
    
    
    
    
    
    
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    /*
     * 公园的A部分
     */
    public class ParkA implements ParkElement {
        private String name;
        @Override
        public void accept(Visitor visitor) {
            // TODO Auto-generated method stub
              visitor.visit(this);//把ParkA传进去
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    
    }
    /*
     * 公园的B部分
     * 
     */
    public class ParkB implements ParkElement{
        private String name;
        @Override
        public void accept(Visitor visitor) {
            // TODO Auto-generated method stub
            visitor.visit(this);//把ParkB传进去
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    
    }
    /*
     * 公园每一部分的抽象
     * 
     */
    public interface ParkElement {
        //用来接纳访问者
        public void accept(Visitor visitor);
    }
    /*
     * 
     * 访问者
     */
    public interface Visitor {
         public void visit(Park park);
         public void visit(ParkA parkA);
         public void visit(ParkB parkB);
    }
    /*
     * 清洁工A,服务parkA的卫生情况
     * 清洁工A,负责parkA的卫生情况
     */
    public class VisitorA implements Visitor {
    
        @Override
        public void visit(Park park) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void visit(ParkA parkA) {
            // TODO Auto-generated method stub
            System.out.println("清洁工A:完成公园"+parkA.getName()+"的卫生");
        }
    
        @Override
        public void visit(ParkB parkB) {
            // TODO Auto-generated method stub
    
        }
    
    }
    /*
     * 清洁工B,负责公园B部分的卫生
     * 
     */
    public class VisitorB implements Visitor{
    
        @Override
        public void visit(Park park) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void visit(ParkA parkA) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void visit(ParkB parkB) {
            // TODO Auto-generated method stub
            //System.out.println("清洁工B:完成公园B的卫生");
        System.out.println("清洁工B:完成公园" +  parkB.getName()+"的卫生");
        
        }
    
    }
    public class VisitorManager implements Visitor{
    
        @Override
        public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.
            // TODO Auto-generated method stub
            //System.out.println("管理员:负责公园卫生检查");    
            System.out.println("管理员:负责"+park.getName()+"卫生检查");    
        }
    
        @Override
        public void visit(ParkA parkA) {
            // TODO Auto-generated method stub
            System.out.println("管理员:负责公园"+parkA.getName()+"部分卫生检查");
        }
    
        @Override
        public void visit(ParkB parkB) {
            // TODO Auto-generated method stub
            System.out.println("管理员:负责公园"+parkB.getName()+"部分卫生检查");
        }
         
    }
  • 相关阅读:
    2020/4/29 一场令人头疼的cf。。。
    2020/4/27 日常补坑-tarjan第一道awa
    2020/4/26 2-sat 学习笔记
    SHADEILS--Success History based Adaptive Differential Evolution with Iterative Local Search
    再探动态规划——lettcode689三个无重叠数组的最大和
    学算法——gradient descent
    学算法——particle swarm optimization
    读论文——A study on Artificial Potential Fields
    install libspatialindex on macOS
    Supervised Learning003
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6750329.html
Copyright © 2011-2022 走看看