美文网首页
设计模式-访问者模式(行为型)

设计模式-访问者模式(行为型)

作者: NealLemon | 来源:发表于2019-09-17 14:45 被阅读0次

    定义

    • 封装作用于某数据结构(如List,Set,Map等)中的各个操作
    • 可以在不改变各元素的类的前提下,定义作用于这些元素的操作。

    适用场景

    • 数据结构和数据操作分离。
    • 一个数据结构包含多个类对象的时候。

    优点

    • 增加新的操作很容易,即增加一个新的访问者。

    缺点

    • 增加新的数据结构困难。
    • 具体元素的变更比较麻烦。

    代码

    我们来实现一个简单的业务场景加深理解

    在我们工作中,有时候难免会遇到出差的状况,那么大部分公司针对员工等级不同,出差报销的额度也不同。我们现在就定义三个等级的报销额度,然后拿代码实现以下具体业务。

    员工等级

    • 普通员工:基本差旅费报销
    • 部门领导:基本差旅费报销+ 补助
    • 管理层:基本差旅费报销+补助+升舱

    这样 三个不同的对象就产生了。我们拿访问者模式搞一下。

    访问者接口(IVisitor)

    /**
     * 访问接口
     */
    public interface IVisitor {
        void visit(Employee employee);
    }
    

    员工抽象类(Employee

    /**
     * 员工抽象类
     */
    public abstract class Employee {
    
        //等级名称
        private String levelName;
    
        //基础福利
        private String basic;
    
        public abstract void accept(IVisitor visitor);
    
    }
    

    普通员工(NormalEmployee)

    /**
     * 普通员工
     */
    public class NormalEmployee extends Employee {
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    }
    

    部门领导(DepartmentEmployee)

    public class DepartmentEmployee extends Employee {
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    }
    

    管理层(LeaderEmployee)

    public class LeaderEmployee extends Employee {
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    }
    

    访问者接口实现类

    public class Visitor implements IVisitor {
        @Override
        public void visit(NormalEmployee employee) {
            System.out.println(employee.getLevelName()+"出差报销规则"+ employee.getBasic());
        }
    
        @Override
        public void visit(DepartmentEmployee employee) {
            System.out.println(employee.getLevelName()+"出差报销规则"+ employee.getBasic() + employee.getAllowance());
        }
    
        @Override
        public void visit(LeaderEmployee employee) {
            System.out.println(employee.getLevelName()+"出差报销规则"+ employee.getBasic()+ employee.getAllowance() + employee.getUpgrade());
        }
    
    
    }
    

    UML类图

    visitorUML.jpg

    测试类

    public class VisitorTest {
    
        public static void main(String[] args) {
            //----------普通员工---------
            NormalEmployee normal = new NormalEmployee();
            normal.setLevelName("普通员工");
            normal.setBasic("基本差旅费报销");
            //--------部门领导---------
            DepartmentEmployee department = new DepartmentEmployee();
            department.setBasic("基本差旅费报销");
            department.setLevelName("部门领导");
            department.setAllowance("餐补,交通补助");
            //-----管理层-----
            LeaderEmployee leader = new LeaderEmployee();
            leader.setBasic("基本差旅费报销");
            leader.setLevelName("管理层");
            leader.setAllowance("餐补,交通补助");
            leader.setUpgrade("飞机头等舱,火车一等座,酒店五星级");
    
            List<Employee> list = new ArrayList<>();
            list.add(normal);
            list.add(department);
            list.add(leader);
    
    
            //访问这些对象的操作
            for (Employee employee : list) {
                employee.accept(new Visitor());
            }
    
        }
    }
    

    输出结果:

    visitorResult.jpg

    小结

    虽然访问者模式用的比较少,但是作为设计模式的一种,我们也需要熟悉理解。

    相关文章

      网友评论

          本文标题:设计模式-访问者模式(行为型)

          本文链接:https://www.haomeiwen.com/subject/qlqaectx.html