设计模式_訪问者模式

Visitor Pattern

Repressent an operation to be performed  on the elements of an object structure.Visitor lets
you define a new operation without changing the classees of the elements on which it operates.(封装一些作用于某种数据结构中的各种元素的操作,它能够在不改变数据结构的前提下定义作用于这些元素的新操作。)

直接上代码吧,心态不佳。

public abstract class Employee {
 public final static int MALE=0;
 public final static int FEMALE=1;

 private String name;
 private String salary;
 private int sex;

 public abstract void accept(IVisitor visitor); //allow a visitor

 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSalary() {
  return salary;
 }
 public void setSalary(String salary) {
  this.salary = salary;
 }
 public int getSex() {
  return sex;
 }
 public void setSex(int sex) {
  this.sex = sex;
 }
}
public class Manager extends Employee{
 private String performance;

 public String getPerformance() {
  return performance;
 }
 public void setPerformance(String performance) {
  this.performance = performance;
 }
 @Override
 public void accept(IVisitor visitor) {
  visitor.visit(this);
 }
}
public class CommonEmployee extends Employee{
 private String job;

 public String getJob() {
  return job;
 }
 public void setJob(String job) {
  this.job = job;
 }
 @Override
 public void accept(IVisitor visitor) {
  visitor.visit(this);
 }
}
public interface IVisitor {
 public void visit(CommonEmployee commonEmployee);
 public void visit(Manager manager);
}

真正的处理类在这里。

public class Visitor implements IVisitor {
 public void visit(CommonEmployee commonEmployee) {
  System.out.println(this.getCommonEmployee(commonEmployee));
 }
 public void visit(Manager manager) {
  System.out.println(this.getManagerInfo(manager));
 }
 private String getBasicInfo(Employee employee) {
  String info = "name:" + employee.getName() + "\t sex:"
    + (employee.getSex() == Employee.FEMALE ?

"man" : "women")
    + "\t salary:" + employee.getSalary();
  return info;
 }

 private String getManagerInfo(Manager manager) {
  String basic = this.getBasicInfo(manager);
  String otherInfo = "\t performance" + manager.getPerformance();
  return basic + otherInfo;
 }

 private String getCommonEmployee(CommonEmployee commonEmployee){
  String basic=this.getBasicInfo(commonEmployee)+"\t";
  String other="job:"+commonEmployee.getJob();
  return basic+other;
 }
}

測试

public class Client {
 public static void main(String[] args) {
  for(Employee e:mockEmployee()){
   e.accept(new Visitor());
  }
 }

 public static List<Employee> mockEmployee(){
  List<Employee> list=new ArrayList<Employee>();

  CommonEmployee zhangsan=new CommonEmployee();
  zhangsan.setJob("coding everyday!");
  zhangsan.setName("zhangsan");
  zhangsan.setSalary("1800");
  zhangsan.setSex(Employee.MALE);

  CommonEmployee lirong=new CommonEmployee();
  lirong.setJob("page coding,It‘s not fansion");
  lirong.setName("lirong");
  lirong.setSalary("1900");
  lirong.setSex(Employee.FEMALE);

  Manager wang=new Manager();
  wang.setName("wamg");
  wang.setPerformance("It‘s unpay basically,but he is a horser!");
  wang.setSalary("10221");
  wang.setSex(Employee.MALE);

  list.add(zhangsan);
  list.add(lirong);
  list.add(wang);
  return list;
 }
}

长处

● 符合单一职责原则

● 优秀的扩展性

● 灵活性很高

缺点

● 详细元素对訪问者发布细节

● 详细元素变更比較困难

● 违背了依赖倒置转原则

使用场景

● 一个对象结构包括非常多类对象,它们有不同的接口,而你想对这些对象实施一些依赖 于其详细类的操作。也就说是用迭代器模式已经不能胜任的情景。

● 须要对一个对象结构中的对象进行非常多不同而且不相关的操作,而你想避免让这些操 作“污染”这些对象的类。

扩展实例

1.统计功能

统计总工资total仅仅须要在IVisitor抽象中加入一个public int getTotalSalary();然后在详细訪问者中实现就可以。

public class Visitor implements IVisitor {
//部门经理的工资系数是5
private final static int MANAGER_COEFFICIENT = 5;
//员工的工资系数是2
private final static int COMMONEMPLOYEE_COEFFICIENT = 2;
//普通员工的工资总和
private int commonTotalSalary = 0;
//部门经理的工资总和
private int managerTotalSalary =0;
//计算部门经理的工资总和
private void calManagerSalary(int salary){
this.managerTotalSalary = this.managerTotalSalary + salary
*MANAGER_COEFFICIENT ;
}
//计算普通员工的工资总和
private void calCommonSlary(int salary){
this.commonTotalSalary = this.commonTotalSalary +
salary*COMMONEMPLOYEE_COEFFICIENT;
}
//获得全部员工的工资总和
public int getTotalSalary(){
return this.commonTotalSalary + this.managerTotalSalary;
}
}

2.多个訪问者

由展示->汇总

IShowVisitor extends IVisitor

ITotalVisitor  extends IVisitor

双分派

java的静态绑定和动态绑定。多态,重写,重载。

你调用我的,我调用你的。谁是主谁是次,真正在哪里处理问题。

我是菜鸟,我在路上。

时间: 2024-10-21 02:03:55

设计模式_訪问者模式的相关文章

设计模式学习总结(21) 訪问者模式

本系列主要记录设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它:它是怎样解决的,掌握它的结构图,记住它的关键代码:可以想到至少两个它的应用实例,一个生活中的,一个软件中的:这个模式的优缺点是什么,其有哪些使用场景,在使用时要注意什么. 尊重作者,转载请注明晔阳的Bloghttp://blog.csdn.net/hacke2 21.訪问者模式 意图:主要讲数据结构与数据操作分离 主要解决:稳定的数据结构和易变的操作耦合问题 什么时候使用:与类本不相关的,为了避免这个污染 ,使用訪问者

Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要取改动数据结构,也不必去改动原有的操作,而运行时再定义新的Visitor时闲着即可了(在操作加入上易拓展) 模式中角色分工 Visitor:抽象訪问者,在重载的visit函数中声明訪问者能够訪问的对象. Concrete Visitor:实现一个訪问者对于一个详细的元素的操作 Element:抽象元

设计模式之十五:訪问者模式(Visitor Pattern)

訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<Design Pattern>):表示一个作用于某对象结构中的各元素的操作.它使你能够在 不改变各元素类的前提下定义作用于这些元素的新操作.从定义能够看出结构对象是使用訪问者模式必备 条件,并且这个结构对象必须存在遍历自身各个对象的方法.这便类似于Java语言其中的collection概念了. 涉及角色 :

PHP设计模式——訪问者模式

声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamhxMDExMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 角色: 1.抽象訪问者(

《Java设计模式》之訪问者模式

訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类型(Static Type),有些人又把静态类型叫做明显类型(Apparent Type):而变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type).比方 [java] view plaincopyprint" class="About" href="

设计模式入门之訪问者模式Visitor

//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作.它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看,这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一些额外的职责).可是装饰模式很多其它是在原有的基础上进行功能加强或者改动:而訪问者模式很多其它是为对象加入全新的功能.訪问者模式适合那些须要频繁为某些类加入新功能.新操作的项目. //模式结构: //Visitor:訪问者接口,为全部的訪问者对象声明一个visit方法,用来表示对对象结构加入的功能,

设计模式之二十四:訪问者模式(Visitor)

訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. UML类图: 主要包括: Vis

訪问者模式的分析、结构图及基本代码

 之前我对全部的23种设计模式作了一个小总结.如今我们来对每一种设计模式作具体的分析.首先是訪问者模式: 定义:表示一个作用于某对象结构中的各元素的操作.它可使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用地方:訪问者模式的目的是要把处理从数据结构分离出来.非常多系统能够依照算法和数据结构分开,假设这种系统有比較稳定的数据结构.又有易于变化的算法的话.使用訪问者模式就是比較合适的,由于訪问者模式使得算法操作的添加变得easy. 优缺点:訪问者模式的长处就是添加新的操作非常

3.5 訪问者模式(5.11)

訪问者模式的学习.能够从以下方面入手. 假设一门编程语言支持双分派(多分派).那么訪问者模式就没有太大的存在价值.其实,看完Java模拟 双分派Double Dispatch,你应该自己做最后的题目:改动上述代码.使得消息a.foo(b),当中a声明为X类型变量.b声明为Z类型变量.题目做完了,訪问者模式你就自己搞出来了. 所以,--要在訪问者模式基础上玩花样时,我们再继续. 訪问者模式的意图,方便于给一个类增添新的接口. 为什么GoF要提到"某种对象结构"和元素呢?好多网上的样例,讲