my idea about visitor pattern

版权声明:本文为博主原创文章,未经博主允许也可以任意转载。 https://blog.csdn.net/fudaxing/article/details/78262932

关注微信公众号:
huyouxiao.com
回复语言名称,比如java,python,go,C, C++.有海量资源免费赠送!
Visitor Pattern
Design Pattern
#Visitor Pattern
##Two things:

  • add new operation to Operate one object’s attribute member without change its original class structure(in other words, without change original codes). That means:

    1. just operate the abstract supper class attributes member.
    2. need add a abstract method with one Visitor arguments, return void.
  • it’s double-dispatcher, for my idea, it need the method name and Element parameter type to indicate the operation.

##Example:
I have a Driver abstract super class. it contains basic data and a method to set Visitor interface.

package com.kado.pattern.operation.Visitor;

public abstract class Driver {
    private String name;
    private String tel;
    private int drivingAge;
    private String status = "in-service";

    public abstract void accept(Visitor visitor);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public int getDrivingAge() {
        return drivingAge;
    }

    public void setDrivingAge(int drivingAge) {
        this.drivingAge = drivingAge;
    }


    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Driver\r\n" +
                "name='" + name + '\'' +
                ", \r\ntel='" + tel + '\'' +
                ", \r\ndrivingAge='" + drivingAge + '\'' +
                ", \r\nstatus='" + status + '\'' +
                "\r\n";
    }
}

So I need a visitor interface, this interface has 3 visit method but with different subclass of Driver(CarDriver, BoatDriver and AirplaneDriver). that means support these three kinds of class operation.

package com.kado.pattern.operation.Visitor;

public interface Visitor {
    public void visit(CarDriver carDriver);
    public void visit(BoatDriver boatDriver);
    public void visit(AirplaneDriver airplaneDriver);
}

The details method are below:
CarDriver

package com.kado.pattern.operation.Visitor;

public class CarDriver extends Driver {

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

BoatDriver

package com.kado.pattern.operation.Visitor;

public class BoatDriver extends Driver {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

AirplaneDriver

package com.kado.pattern.operation.Visitor;

public class AirplaneDriver extends Driver {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

The first Customer requirements, need print all drivers information:

package com.kado.pattern.operation.Visitor;

public class ShowVisitor implements Visitor {
    @Override
    public void visit(CarDriver carDriver) {
        System.out.println("a car driver");
        this.printMessage(carDriver);
    }

    @Override
    public void visit(BoatDriver boatDriver) {
        System.out.println("a boat driver");
        this.printMessage(boatDriver);
    }

    @Override
    public void visit(AirplaneDriver airplaneDriver) {
        System.out.println("a airplane driver");
        this.printMessage(airplaneDriver);
    }
    public void printMessage(Driver driver){
        System.out.println(driver.toString());
    }
}

The second customer requirements, different driver has different driver age limitation, so each year need judge, if reach the top limitation. change it’s status to off service. others increase its driving age.

package com.kado.pattern.operation.Visitor;

public class StatusVisitor implements Visitor {
    public int carMaxDrivingAge=40;
    public int boatMaxDrivingAge=30;
    public int airplaneMaxDrivingAge=20;
    @Override
    public void visit(CarDriver carDriver) {
        if(carDriver.getDrivingAge()>= carMaxDrivingAge) {
            carDriver.setStatus("off-service");
            System.out.println("off-service"+carDriver.toString());
            System.out.println("I can not driving boat any longer,but I also can driving car!");
        } else {
            carDriver.setDrivingAge(carDriver.getDrivingAge()+1);
        }
    }

    @Override
    public void visit(BoatDriver boatDriver) {
        if(boatDriver.getDrivingAge()>= boatMaxDrivingAge) {
            boatDriver.setStatus("off-service");
            System.out.println("off-service"+boatDriver.toString());
            System.out.println("I need apply one car driver for me!");
        } else {
            boatDriver.setDrivingAge(boatDriver.getDrivingAge()+1);
        }
    }

    @Override
    public void visit(AirplaneDriver airplaneDriver) {
        if(airplaneDriver.getDrivingAge()>= airplaneMaxDrivingAge) {
            airplaneDriver.setStatus("off-service");
            System.out.println("off-service"+airplaneDriver.toString());
            System.out.println("I am going to be a teacher.");
        } else {
            airplaneDriver.setDrivingAge(airplaneDriver.getDrivingAge()+1);
        }
    }

}

The third customer requirements, need sum these three kinds of driver amount. also need count off service drivers amount.

package com.kado.pattern.operation.Visitor;

public class SumVisitor implements Visitor {
    private int totalCarDriver = 0;
    private int totalBoatDriver = 0;
    private int totalAirplaneDriver = 0;
    private int offServiceDriver = 0;
    private int carOffServiceDriver = 0;
    private int boatOffServiceDriver = 0;
    private int airplaneOffServiceDriver = 0;

    @Override

    public void visit(CarDriver carDriver) {
        totalCarDriver++;
        if(carDriver.getStatus().equals("off-service")) {
            offServiceDriver++;
            carOffServiceDriver++;
        }
    }

    @Override
    public void visit(BoatDriver boatDriver) {
        totalBoatDriver++;
        offServiceDriver++;
        boatOffServiceDriver++;
    }

    @Override
    public void visit(AirplaneDriver airplaneDriver) {
        totalAirplaneDriver++;
        airplaneOffServiceDriver++;
    }

    public int getTotalCarDriver() {
        return totalCarDriver;
    }

    public void setTotalCarDriver(int totalCarDriver) {
        this.totalCarDriver = totalCarDriver;
    }

    public int getTotalBoatDriver() {
        return totalBoatDriver;
    }

    public void setTotalBoatDriver(int totalBoatDriver) {
        this.totalBoatDriver = totalBoatDriver;
    }

    public int getTotalAirplaneDriver() {
        return totalAirplaneDriver;
    }

    public void setTotalAirplaneDriver(int totalAirplaneDriver) {
        this.totalAirplaneDriver = totalAirplaneDriver;
    }


    public int getOffServiceDriver() {
        return offServiceDriver;
    }

    public void setOffServiceDriver(int offServiceDriver) {
        this.offServiceDriver = offServiceDriver;
    }

    public int getCarOffServiceDriver() {
        return carOffServiceDriver;
    }

    public void setCarOffServiceDriver(int carOffServiceDriver) {
        this.carOffServiceDriver = carOffServiceDriver;
    }

    public int getBoatOffServiceDriver() {
        return boatOffServiceDriver;
    }

    public void setBoatOffServiceDriver(int boatOffServiceDriver) {
        this.boatOffServiceDriver = boatOffServiceDriver;
    }

    public int getAirplaneOffServiceDriver() {
        return airplaneOffServiceDriver;
    }

    public void setAirplaneOffServiceDriver(int airplaneOffServiceDriver) {
        this.airplaneOffServiceDriver = airplaneOffServiceDriver;
    }
}

the Main Test

package com.kado.pattern.operation.Visitor;

import java.util.ArrayList;
import java.util.Random;

public class VisitorMain {
    public static void main(String args[]) {
        ArrayList<Driver> drivers = new ArrayList<>(3);
        CarDriver carDriver = new CarDriver();
        carDriver.setName("kado");
        carDriver.setTel("15888767782");
        carDriver.setDrivingAge(3);
        drivers.add(carDriver);

        BoatDriver boatDriver = new BoatDriver();
        boatDriver.setName("tom");
        boatDriver.setTel("19898890090");
        boatDriver.setDrivingAge(9);
        drivers.add(boatDriver);

        AirplaneDriver airplaneDriver = new AirplaneDriver();
        airplaneDriver.setName("Kevin");
        airplaneDriver.setTel("10002234421");
        airplaneDriver.setDrivingAge(20);
        drivers.add(airplaneDriver);

        Random random = new Random();
        int randomValue = random.nextInt(100);
        for(int i=0; i<randomValue; i++) {
            CarDriver carDriverTemp = new CarDriver();
            carDriverTemp.setName("carDriverTemp"+i);
            carDriverTemp.setTel("158888888"+i);
            carDriverTemp.setDrivingAge(random.nextInt(50));
            drivers.add(carDriverTemp);
        }

        randomValue = random.nextInt(100);
        for(int i=0; i<randomValue; i++) {
            BoatDriver boatDriverTemp = new BoatDriver();
            boatDriverTemp.setName("tom"+i);
            boatDriverTemp.setTel("1989"+i);
            boatDriverTemp.setDrivingAge(random.nextInt(50));
            drivers.add(boatDriverTemp);
        }

        randomValue = random.nextInt(100);
        for(int i=0; i<randomValue; i++) {
            AirplaneDriver airplaneDriverTemp = new AirplaneDriver();
            airplaneDriverTemp.setName("Kevin"+i);
            airplaneDriverTemp.setTel("101"+i);
            airplaneDriverTemp.setDrivingAge(random.nextInt(50));
            drivers.add(airplaneDriverTemp);
        }


        Visitor visitor = new ShowVisitor();
        Visitor statusVisitor = new StatusVisitor();
        Visitor sumVisitor = new SumVisitor();
        for(Driver driver : drivers) {
            driver.accept(visitor);
            driver.accept(statusVisitor);
            driver.accept(sumVisitor);
        }
        System.out.println( "The total sum of car driver : "+ ((SumVisitor)sumVisitor).getTotalCarDriver() );
        System.out.println( "The total sum of boat driver : "+ ((SumVisitor)sumVisitor).getTotalBoatDriver() );
        System.out.println( "The total sum of airplane driver : "+ ((SumVisitor)sumVisitor).getTotalAirplaneDriver() );
        System.out.println( "The total sum of driver that is off service  : "+ ((SumVisitor)sumVisitor).getOffServiceDriver() );
        System.out.println( "The total sum of car driver that is off service  : "+ ((SumVisitor)sumVisitor).getCarOffServiceDriver() );
        System.out.println( "The total sum of boat driver that is off service  : "+ ((SumVisitor)sumVisitor).getBoatOffServiceDriver() );
        System.out.println( "The total sum of airplane driver that is off service  : "+ ((SumVisitor)sumVisitor).getAirplaneOffServiceDriver() );
    }
}

猜你喜欢

转载自blog.csdn.net/fudaxing/article/details/78262932