`
luochuang
  • 浏览: 24145 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

访问者模式

阅读更多

案例:计价员拿到采购单之后根据采购单物品名称和数量计算总价,采购员根据采购单名称和数量采购。采购单看作采购物集合,不同操作人员对采购单进行不同处理。

 

 

  • 包含访问者和被访问元素两个主要组成。被访问元素通常有不同的类型,不同访问者可对它们进行不同访问操作。
  • 被访问元素通常不单独存在,存储在一个集合中,集合被称为“对象结构”,访问者遍历对象结构对存储的元素逐个操作。

 

抽象访问者:为对象结构中每一个具体元素声明一个访问操作,从这个操作名称或参数类型可以清楚知道需要访问的具体元素的类型

 

 

//抽象访问者
abstract class Department {
    public abstract void visit(FulltimeEmployee employee);
    public abstract void visit(ParttimeEmployee employee);
}
 

 

具体访问者:实现了每个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型元素

 

 

//财务部类:具体访问者类
class FADepartment extends Department {
    //实现财务部对全职员工的访问
    public void visit(FulltimeEmployee employee) {
        int workTime = employee.getWorkTime();
        double weekWage = employee.getWeeklyWage();
        if (workTime > 40) {
            weekWage = weekWage + (workTime - 40) * 100;
        } else if (workTime < 40) {
            weekWage = weekWage - (40 - workTime) * 80;
            if (weekWage < 0) {
                weekWage = 0;
            }
        }
        System.out.println("正式员工" + employee.getName() + "实际工资为:" + weekWage + "元。");
    }

    //实现财务部对兼职员工的访问
    public void visit(ParttimeEmployee employee) {
        int workTime = employee.getWorkTime();
        double hourWage = employee.getHourWage();
        System.out.println("临时工" + employee.getName() + "实际工资为:" + workTime * hourWage + "元。");
    }
}
 

 

 

//人力资源部类:具体访问者类
class HRDepartment extends Department {
    //实现人力资源部对全职员工的访问
    public void visit(FulltimeEmployee employee) {
        int workTime = employee.getWorkTime();
        System.out.println("正式员工" + employee.getName() + "实际工作时间为:" + workTime + "小
        if (workTime > 40) {
            System.out.println("正式员工" + employee.getName() + "加班时间为:" + (workTime - 40) +
                    "小时。");
        } else if (workTime < 40) {
            System.out.println("正式员工" + employee.getName() + "请假时间为:" + (40 - workTime) +
        }
    }

    //实现人力资源部对兼职员工的访问
    public void visit(ParttimeEmployee employee) {
        int workTime = employee.getWorkTime();
        System.out.println("临时工" + employee.getName() + "实际工作时间为:" + workTime + "小时。");
    }
}
 

 

抽象元素:抽象元素一般是抽象类或者接口,定义一个accept()方法,该方法通常以一个抽象访问者作为参数。

 

 

interface Employee {
    //接受一个抽象访问者访问
    public void accept(Department handler); 
}
 

 

具体元素:实现了accept方法,在accept方法中调用访问者的访问方法完成对一个元素的操作。

 

 

class FullTimeEmployee implements Employee {
    private String name;
    private double weeklyWage;
    private int workTime;

    public FullTimeEmployee(String name, double weeklyWage, int workTime) {
        this.name = name;
        this.weeklyWage = weeklyWage;
        this.workTime = workTime;
    }

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

    public void setWeeklyWage(double weeklyWage) {
        this.weeklyWage = weeklyWage;
    }

    public void setWorkTime(int workTime) {
        this.workTime = workTime;
    }

    public String getName() {
        return (this.name);
    }

    public double getWeeklyWage() {
        return (this.weeklyWage);
    }

    public int getWorkTime() {
        return (this.workTime);
    }

    public void accept(Department handler) {
        handler.visit(this); //调用访问者的访问方法
    }
}
 

 

 

class PartTimeEmployee implements Employee {
    private String name;
    private double hourWage;
    private int workTime;

    public PartTimeEmployee(String name, double hourWage, int workTime) {
        this.name = name;
        this.hourWage = hourWage;
        this.workTime = workTime;
    }

    public String getName() {
        return name;
    }

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

    public double getHourWage() {
        return hourWage;
    }

    public void setHourWage(double hourWage) {
        this.hourWage = hourWage;
    }

    public int getWorkTime() {
        return workTime;
    }

    public void setWorkTime(int workTime) {
        this.workTime = workTime;
    }

    public void accept(Department handler) {
        handler.visit(this); //调用访问者的访问方法 
    }
}
 
对象结构  是一个元素的集合,它用于存放元素对象,并且提供遍历其内部元素方法。它结合组合模式实现,也可以是一个简单的集合对象,如一个List或一个Set。
class EmployeeList {
    //定义一个集合用于存储员工对象
    private ArrayList<Employee> list = new ArrayList<Employee>();

    public void addEmployee(Employee employee) {
        list.add(employee);
    }

    //遍历访问员工集合中的每一个员工对象
    public void accept(Department handler) {
        for (Object obj : list) {
            ((Employee) obj).accept(handler);
        }
    }
}
 
  • 要在系统中增加一种新的访问者,只要增加一个新的具体访问者类即可,从增加新的访问者角度看,模式符合“开闭原则”。
  • 要在系统中增加一种新的具体元素,如“退休人员”,则必须对原有系统修改,在原有抽象访问者类中增加访问方法。从增加新的元素角度看,模式违背“开闭原则”。
  • 模式很方便地添加新的访问者,但添加新元素较麻烦

适用场景

 

  1. 对象结构中对象对应类很少改变,但经常要在此对象结构上定义新操作。
  2. 一个对象结构包含多个类型的对象,在访问者中针对每一种具体的类型都提供了一个访问操作,不同类型的对象可以有不同的访问操作。
  3. 需要对一个对象结构中的对象进行很多不同不相关操作,不希望在增加新操作时修改这些类。将相关访问操作集中起来定义在访问者类中,对象结构可以被多个不同的访问者类所使用,将对象本身与对象的访问操作分离。

参考:刘伟设计模式

 

 

 

 

 

 

分享到:
评论

相关推荐

    设计模式C++学习之访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    访问者模式在实际开发中的Demo

    《访问者模式在实际开发中的应用深度解析》 访问者模式是设计模式中的一种行为模式,它在实际的软件开发中具有重要的应用价值。通过理解并掌握访问者模式,开发者可以更好地实现对象结构中元素的操作,同时保持元素...

    设计模式 访问者模式

    **访问者模式**是一种行为设计模式,它允许在不修改对象结构的情况下添加新的操作。这种模式主要用于处理具有复杂对象结构的情况,使得我们可以对结构中的每个元素执行特定操作,而无需暴露其内部实现。 访问者模式...

    访问者模式Demo

    **访问者模式**是一种设计模式,它在软件工程中用于在不修改对象结构的前提下,为对象添加新的操作或行为。这种模式将数据结构与数据操作分离,使得可以在不改变对象本身的情况下扩展其功能。访问者模式是行为设计...

    访问者模式代码

    访问者模式是一种设计模式,属于行为模式类别,其主要目的是在不修改对象结构的前提下,为对象结构中的元素提供新的操作。这种模式的核心思想是将数据结构与数据操作分离,使得增加新的操作变得容易,同时也避免了对...

    设计模式 - 访问者模式

    **访问者模式** 访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下向其添加新的操作。这种模式常用于处理具有相同接口或抽象类的对象结构,使得可以在不改变原有结构的基础上...

    访问者模式例子2

    访问者模式是一种设计模式,它在对象结构中定义了一个访问并操作其元素的接口。这种模式主要用于在不改变对象结构的前提下增加对象的功能。在“访问者模式例子2”中,我们将深入探讨如何利用该模式来扩展系统的行为...

    68丨访问者模式(上):手把手带你还原访问者模式诞生的思维过程1

    【访问者模式】是一种行为设计模式,其主要目的是在不修改已有对象结构的前提下,为对象增加新的操作。这种模式在23种经典设计模式中属于较为复杂的一种,因为它的理解和应用相对困难,可能导致代码可读性和可维护性...

    访问者模式例子

    访问者模式是一种设计模式,属于行为模式类别,它在软件工程中被用来分离对象结构与对这个结构进行操作的行为。这种模式的主要目的是使代码结构更加灵活,同时增加新的操作而无需修改现有对象结构。在“访问者模式”...

    设计模式的访问者模式的例子

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响对象结构本身。这种模式的主要目的是将数据操作与数据结构分离,使得数据结构的变化...

    设计模式之访问者模式

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响这些元素自身的行为。这种模式的主要目的是将数据操作和业务逻辑分离,使得数据结构...

    设计模式之访问者模式(Visitor)

    **访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...

    java设计模式之访问者模式

    访问者模式是一种软件设计模式,它允许在不改变对象结构的情况下,在对象的现有结构上增加新的操作。在Java中,这种模式尤其有用,因为它能够帮助我们保持类的封装性,同时提供了一种灵活的方式来扩展对象的功能。...

    设计模式-访问者模式(讲解及其实现代码)

    **访问者模式详解** 访问者模式是一种行为设计模式,它允许在不修改对象结构的情况下向对象添加新的操作。这种模式的核心思想是将数据结构与算法分离,使得算法可以在不改变对象结构的前提下增加对对象的操作。 在...

    Objective C 访问者模式设计源码

    访问者模式是一种软件设计模式,属于行为模式范畴,它的核心思想是将数据结构与数据操作分离,使得在不修改原有对象结构的情况下,可以为对象添加新的操作。这种模式常用于处理具有复杂对象结构且需要对这些对象进行...

    设计模式之访问者模式Java版本实现

    **访问者模式**是软件设计模式中的一种结构型模式,它允许在不修改对象结构的情况下,在对象上增加新的操作。这种模式将数据结构与数据操作分离,使得代码更易于维护和扩展。 在Java中实现访问者模式,通常包括以下...

    设计模式之访问者模式(Visitor Pattern)

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

    uml 文档 访问者模式

    访问者模式是一种设计模式,主要用于在不修改原有类层次结构的基础上,增加新的操作或功能。在UML(统一建模语言)文档中,访问者模式通常用于表示对象结构中的类如何接受并处理来自访问者的访问请求。这个模式的...

Global site tag (gtag.js) - Google Analytics