`

访问者模式

 
阅读更多
<!--StartFragment-->

<!--StartFragment-->

<!--StartFragment-->

 

抽象访问者(Visitor): 抽象类或者接口, 声明访问者可以访问哪些元素, 具体到程序中就是 visit方法的参数定义哪些对象是可以被访问的;

package VisitorPattern.visitor;

import VisitorPattern.element.CommonEmployee;
import VisitorPattern.element.ManagerEmployee;

//申明可以访问那些元素
public interface Visitor {

	public void visit(CommonEmployee employee);
	
	public void visit(ManagerEmployee employee);
	
}
package VisitorPattern.visitor;

public interface ShowVisitor extends Visitor{

	public String show();
}

 

package VisitorPattern.visitor;

public interface TongjiVisitor extends Visitor{

	public int getTotalSalary();
}

  

 

<!--StartFragment-->

具体访问者(ConcreteVisitor): 访问者访问到一个类后该怎么干(哎, 这个别读歪了), 要做什么事情;

package VisitorPattern.visitor;

import VisitorPattern.element.CommonEmployee;
import VisitorPattern.element.ManagerEmployee;

public class ShowVisitorImpl implements ShowVisitor{
	
	private String info = "";

	@Override
	public void visit(CommonEmployee employee) {
		
		info = info + "只关心普通员工的工作:"+employee.getJob()+";";
	}

	@Override
	public void visit(ManagerEmployee employee) {
		
		info = info + "只关心经理的姓名:"+employee.getName()+";";
		
	}

	@Override
	public String show() {
		
		return info;
	}

}

 

package VisitorPattern.visitor;

import VisitorPattern.element.CommonEmployee;
import VisitorPattern.element.ManagerEmployee;

//用作统计
public class TongjiVisitorImpl implements TongjiVisitor{
	
	private int commonEmTotalSalary;
	
	private int managerEmTotalSalary;

	@Override
	public void visit(CommonEmployee employee) {
		commonEmTotalSalary = commonEmTotalSalary+employee.getSalary();
	}

	@Override
	public void visit(ManagerEmployee employee) {
		managerEmTotalSalary = managerEmTotalSalary + employee.getSalary();
	}
	
	public int getTotalSalary(){
		return commonEmTotalSalary + managerEmTotalSalary;
	}
	
	
}

 

<!--StartFragment-->

抽象元素(Element): 接口或者抽象类, 声明接受那一类型的访问者访问, 程序上是通过 accept 方法

中的参数来定义;

<!--EndFragment-->

package VisitorPattern.element;

import VisitorPattern.visitor.Visitor;

public abstract class Employee {
	
	private String name;
	
	private String job; 
	
	private int salary;
	
	public Employee(String name,String job,int salary){
		this.name = name;
		this.job = job;
		this.salary = salary;
	}

	public abstract void accept(Visitor visitor);
	
	public String getName() {
		return name;
	}

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


	public String getJob() {
		return job;
	}


	public void setJob(String job) {
		this.job = job;
	}

	public int getSalary() {
		return salary;
	}

	public void setSalary(int salary) {
		this.salary = salary;
	}
	
}

 

<!--StartFragment-->

具体元素:(ConcreteElement): 实现 accept 方法, 通常是 visitor.visit(this), 基本上都形成了一

个套路了;

<!--EndFragment-->

package VisitorPattern.element;

import VisitorPattern.visitor.Visitor;

public class CommonEmployee extends Employee{


	public CommonEmployee(String name, String job,int salary) {
		super(name, job,salary);
	}

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

}

 

package VisitorPattern.element;

import VisitorPattern.visitor.Visitor;

public class ManagerEmployee extends Employee{


	public ManagerEmployee(String name, String job,int salary) {
		super(name, job,salary);
	}

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

}

 

<!--StartFragment-->

结构对象(ObjectStruture): 容纳多个不同类、 不同接口的容器, 比如 List、 Set、 Map 等, 在项目中,

一般很少抽象出来这个角色;

<!--EndFragment-->

客户端调用

package VisitorPattern;

import java.util.ArrayList;
import java.util.List;

import VisitorPattern.element.CommonEmployee;
import VisitorPattern.element.Employee;
import VisitorPattern.element.ManagerEmployee;
import VisitorPattern.visitor.ShowVisitor;
import VisitorPattern.visitor.TongjiVisitor;
import VisitorPattern.visitor.TongjiVisitorImpl;
import VisitorPattern.visitor.ShowVisitorImpl;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		ShowVisitor showVisitor = new ShowVisitorImpl();
		TongjiVisitor tongjiVisitor = new TongjiVisitorImpl();
		
		List<Employee> emList = new ArrayList<Employee>();
		
		emList.add(new CommonEmployee("张三","美工",2500));
		emList.add(new ManagerEmployee("王五","财务经理",7000));
		emList.add(new CommonEmployee("李四","架构师",6000));
		emList.add(new ManagerEmployee("赵六","IT经理",8000));
		
		for (Employee employee : emList) {
			employee.accept(showVisitor);
			employee.accept(tongjiVisitor);
		}
		
		System.out.println(tongjiVisitor.getTotalSalary());
		
		System.out.println(showVisitor.show());

	}

}

  

 

<!--EndFragment--><!--EndFragment-->
分享到:
评论

相关推荐

    设计模式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