JAVA设计模式之:訪问者模式
- 訪问者模式:
- 一个作用于某对象结构中各元素的操作,使你能够在不改变各元素类数据结构的前提下添加作用于这些元素的新操作。
- 结构对象是訪问者模式必备条件。且这个结构对象必须存在遍历自身各个对象的方法。
- 适用于:数据结构相对稳定,把数据结构和作用与其上的其他操作解耦,使得操作相对自由。
- 长处:
- 1、符合单一职责原则
- 2、扩展性良好:元素类能够通过接受不同的訪问者来实现对不同操作的扩展。
- 缺点:
- 1、假设要添加新元素。则会让操作变得更复杂
- 2、在一定程序上破坏了封装性原则
*
訪问者械五大角色对象:
1.Visitor 抽象訪问者角色
2.ConcreteVisitor.详细訪问者角色
3.Element 接受訪问操作元素
4.ConcreteElement 详细元素
5.ObjectStructure 结构对象角色,这是使用訪问者模式必备的角色。
/**
* 抽象訪问者:为该对象结构中详细元素角色声明一个訪问操作接口。
* 该操作接口的名字和參数标识了发送訪问请求给详细訪问者的详细元素角色,
* 这样訪问者就能够通过该元素角色的特定接口直接訪问它。
* @description:
* @date 2016-1-15 下午4:00:29
*/
public interface Visitor {
void visit(Element element);
}
/**
* 详细訪问者角色,实现Visitor声明的接口。
* @description:
* @date 2016-1-15 下午4:20:46
*/
public class ConcreteVisitor implements Visitor{
@Override
public void visit(Element element) {
Staff e=(Staff) element;
//比方:加薪的计算方式:职位*加薪系数+工龄*相应系统之和 除以10 再乘以如今工资
System.out.println(e.getName()+"要加的薪水是:"+(e.getDegree()*0.8+e.getWorkAges()*0.5)/10*e.getSalary());//
}
}
/**
* 定义一个接受訪问操作类,訪问者(Visitor)操作函数的參数。
* @description:
* @date 2016-1-15 下午3:58:28
*/
public abstract class Element {
public abstract void Acceppt(Visitor visitor);
}
/**
* 详细元素,实现了抽象元素(Element)所定义的接受操作接口。
* @description:
* @date 2016-1-15 下午4:04:24
*/
public class Staff extends Element {
private String name;
private float salary;
private int workAges;
private int degree;
public Staff(String name, float salary, int workAges, int degree) {
super();
this.name = name;
this.salary = salary;
this.workAges = workAges;
this.degree = degree;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public int getWorkAges() {
return workAges;
}
public void setWorkAges(int workAges) {
this.workAges = workAges;
}
public int getDegree() {
return degree;
}
public void setDegree(int degree) {
this.degree = degree;
}
@Override
public void Acceppt(Visitor visitor) {
visitor.visit(this);
}
}
/**
* 结构对象:这是使用訪问者模式必备的角色。
* 它具备下面特性:
* 能枚举它的元素;
* 能够提供一个高层接口以同意訪问者訪问它的元素;
* 如有须要,能够设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
* @description:
* @date 2016-1-15 下午4:26:30
*/
public class StaffObject {
private HashMap<String, Staff> employees;
public StaffObject() {
employees = new HashMap<String, Staff>();
}
public void addEmployee(Staff e) {
if (!employees.containsKey(e.getName())) {
employees.put(e.getName(), e);
}
}
public void removeEmployee(Staff e) {
if (employees.containsKey(e.getName())) {
employees.remove(e);
}
}
public Staff getEmployee(String name) {
return employees.get(name);
}
public void Accept(Visitor v) {
for (Staff e : employees.values()) {
e.Acceppt(v);
}
}
}
測试类
public class Test {
public static void main(String[] args) {
StaffObject e=new StaffObject();
e.addEmployee(new Staff("张三", 3000f, 2, 1));
e.addEmployee(new Staff("李四", 5000f, 4, 2));
e.addEmployee(new Staff("王五", 8000f, 6, 3));
e.addEmployee(new Staff("沈七", 10000f, 9, 4));
e.Accept(new ConcreteVisitor());
}
}
执行结果:
李四要加的薪水是:1800.0
张三要加的薪水是:540.0
沈七要加的薪水是:7700.0
王五要加的薪水是:4320.0
JAVA设计模式之:訪问者模式的更多相关文章
- JAVA设计模式之 訪问者模式【Visitor Pattern】
一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...
- 《Java设计模式》之訪问者模式
訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...
- Java设计模式(三) Visitor(訪问者)模式及多分派场景应用
基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...
- 设计模式之十五:訪问者模式(Visitor Pattern)
訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...
- PHP设计模式——訪问者模式
声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: w ...
- 设计模式之二十四:訪问者模式(Visitor)
訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elemen ...
- C++设计模式实现--訪问者(Visitor)模式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/L_Andy/article/details/36896645 一. 訪问者模式 定义:表示一个作用于 ...
- 设计模式入门之訪问者模式Visitor
//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...
- Java设计模式之《职责链模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...
随机推荐
- (转)淘淘商城系列——使用JsonView来格式化json字符串
http://blog.csdn.net/yerenyuan_pku/article/details/72846025 有时从服务端返回的json字符串往往晦涩难懂,就像下面这样,一行显示出来,让人非 ...
- 安全,轻松的Axios与Nuxt.js集成
modules: [ // Doc: https://github.com/nuxt-community/axios-module#usage '@nuxtjs/axios' ], /* ** Axi ...
- reversed()函数和sorted()函数
#reversed()反转排序,可对列表.元组.区间等进行排序 #练习1 a = range(10) a_list = [x for x in reversed(a)] print(a_list) # ...
- vuecli开发项目,文件打包后,appjs/vendorjs文件过大
项目上线后,浏览器第一次加载会特别特别慢,network中看到vendorjs文件1.9M,不慢才怪. echarts按需引入后,也有1.1M左右,由于对vue脚手架理解不深,自己扒了大量的文档,又测 ...
- IP地址、MAC地址、ARP地址解析协议
互联网中一台主机要和另一台主机实现通信首先需要知道彼此在互联网中的位置,主机在互联网中的位置是通过ip地址标记的,当找到ip地址后,再通过端口号标识运行在主机中的进程从而实现通信. IP地址: IP地 ...
- Linux之 sed用法
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- 【nginx】记录nginx+php-fpm实现大文件下载排坑的过程
先上一段代码,支持大文件下载和断点续传,代码来源互联网. set_time_limit(0); // 省略取文件路径的过程,这里直接是文件完整路径 $filePath = get_save_path( ...
- 09.C语言:预处理(宏定义)、字节序、地址对齐
一.预处理 预处理 gcc -E Hello.c -o hello.i 编译 gcc -S hello.i -o hello.s 汇编 gcc -c hello.s -o hello.o 链接 gcc ...
- linux设置系统时间与各种阻塞
前阵子做了一个P2P的通信系统,发现开机的时候和中间运行的时候会莫名报错,这个问题找了好久,后来从日志中看出来,所有节点上阻塞的操作同时超时. 而在超时左右,有新节点自动加入系统. 在新节点加入系统的 ...
- 3.8.5 多重选择:switch语句
在处理多个选项时,使用if/else结构显得有些笨拙. Scanner in = new Scanner(System.in); Syste ...