【软考】设计模式之访问者模式

目录

        • 1. 说明
        • 2. 应用场景
        • 3. 结构图
        • 4. 构成
        • 5. java示例
          • 5.1 喂动物
            • 5.1.1 抽象访问者
            • 5.1.2 具体访问者
            • 5.1.3 抽象元素
            • 5.1.4 具体元素
            • 5.1.5 对象结构
            • 5.1.6 客户端类
            • 5.1.7 结果示例
          • 5.2 超市销售系统
            • 5.2.1 业务场景
            • 5.2.2 业务需求类图
            • 5.2.3 抽象访问者
            • 5.2.4 具体访问者
            • 5.2.5 抽象元素
            • 5.2.6 具体元素
            • 5.2.7 对象结构
            • 5.2.8 客户端类
            • 5.2.9 结果示例
            • 5.2.10 改进

1. 说明
  • 1.访问者设计模式(Visitor Design Pattern)是一种常见的软件设计模式
  • 2.属于行为型设计模式,行为型对象模式
  • 3.目的:分离数据结构与数据操作,在不改变元素数据结构的情况下,进行添加元素操作
2. 应用场景
  • 1.类的结构改变较少,但经常要增加新的基于该结构的操作
  • 2.需要对某一对象结构的对象进行很多不同的并且不相关的操作,而需要避免让这些操作污染这些对象的类,也不希望在新增操作时修改这些类
3. 结构图

在这里插入图片描述

4. 构成
  • 1.访问者模式由抽象访问者、具体访问者、抽象元素、具体元素、对象结构等角色构成
  • 2.抽象访问者(Visitor):定义访问具体元素的接口,为每个具体元素类声明一个Visit操作,该操作的参数类型标识了被访问的具体元素
  • 3.具体访问者(ConcreteVisitor):实现抽象访问者中声明的各个Visit操作
  • 4.抽象元素(Element):声明一个包含接受操作Accept()的接口,Accept()参数为被接受访问者
  • 5.具体元素(ConcreteElement):实现一个访问者为参数的Accept操作
  • 6.对象结构(ObjectStructure):包含抽象元素的容器,提供让访问者对象遍历容器中所有元素的方法(List、Set、Map等)
5. java示例
5.1 喂动物
5.1.1 抽象访问者
  • 1.一个抽象访问者接口
  • 2.定义访问具体元素的方法feed,为每个具体元素类声明一个喂养的方法,喂狗和喂猫,喂养操作的参数类型标识了被访问的具体元素为狗和猫
package com.learning.visitor;
/**
* 抽象访问者
*/
public interface Person {public void feed(Dog dog);public void feed(Cat cat);
}
5.1.2 具体访问者
  • 1.具体访问者(ConcreteVisitor):实现抽象访问者中声明的各个Visit操作
  • 2.自家主人实现抽象访问者中声明的喂狗、喂猫操作
  • 3.其他人实现抽象访问者中声明的喂狗、喂猫操作
package com.learning.visitor;/***  自家主人*/
public class Owner implements Person{@Overridepublic void feed(Cat cat) {System.out.println("主人喂食猫");}@Overridepublic void feed(Dog dog) {System.out.println("主人喂食狗");}
}
package com.learning.visitor;/*** 其他人*/
public class Someone implements Person{@Overridepublic void feed(Dog dog) {System.out.println("其他人喂食狗");}@Overridepublic void feed(Cat cat) {System.out.println("其他人喂食猫");}
}
5.1.3 抽象元素
  • 1.定一个动物接口,声明一个接收一个人的方法
  • 2.表明是谁喂,参数人为被接受访问者
package com.learning.visitor;
/**
* 抽象元素  动物
*/
public interface Animal {void accept(Person person);
}
5.1.4 具体元素
  • 1.实现accept操作,参数是一个访问者
package com.learning.visitor;
/**
* 狗
*/
public class Dog implements Animal{@Overridepublic void accept(Person person) {person.feed(this);System.out.println("汪汪汪");}
}
package com.learning.visitor;/*** 猫*/
public class Cat implements Animal{@Overridepublic void accept(Person person) {person.feed(this);System.out.println("喵喵喵");}
}
5.1.5 对象结构
  • 1.包含抽象元素的容器,提供让访问者对象遍历容器中所有元素的方法(List、Set、Map等)
  • 2.通过add方法,将具体的元素狗和猫放进List中
  • 3.提供遍历List中所有元素的方法action
package com.learning.visitor;import java.util.ArrayList;
import java.util.List;/*** 家*/
public class Home {// 声明一个集合对象,用来存储元素对象private List<Animal> animalList = new ArrayList<>();// 添加元素功能public void add(Animal animal){animalList.add(animal);}public void action(Person person){//遍历集合,获取每一个元素,让访问者访问每一个元素for(Animal animal : animalList){animal.accept(person);}}
}
5.1.6 客户端类
package com.learning.visitor;/*** 客户端*/
public class Client {public static void main(String[] args) {//创建home对象Home home = new Home();// 添加元素到home对象中home.add(new Dog());home.add(new Cat());//创建主人对象Owner owner = new Owner();// 主人喂猫home.action(owner);//创建其他人对象Someone someone = new Someone();//其他人喂食home.action(someone);}
}
5.1.7 结果示例

在这里插入图片描述

5.2 超市销售系统
5.2.1 业务场景
  • 1.假设现在要创建一个简单的超市销售系统,顾客将毛巾、饼干、酸奶等物品(Item)加入购物车(Shopping_Cart),在收银台(Checkout)人工(Manual)或自动(Auto)地将购物车中每个物品的价格汇总到总价格后结账。
5.2.2 业务需求类图

在这里插入图片描述

5.2.3 抽象访问者
  • 1.该场景下,抽象访问者为收银台Checkout
  • 2.定义访问具体元素的方法checkout,为每个具体元素类声明一个结账的方法,结账操作的参数类型标识了被访问的具体元素为毛巾、饼干和酸奶等
package com.learning.visitor.shop;// 结账接口
interface Checkout {// 结账毛巾void checkout(Towel towel);// 结账饼干void checkout(Cookie cookie);// 结账酸奶void checkout(Yogurt yogurt);
}  
5.2.4 具体访问者
  • 1.具体访问者(ConcreteVisitor):实现抽象访问者中声明的各个结账操作
  • 2.人工结账实现抽象访问者中声明的结账毛巾、饼干、酸奶操作
  • 3.自动结账实现抽象访问者中声明的结账毛巾、饼干、酸奶操作
package com.learning.visitor.shop;// 人工结账类
public class ManualCheckout implements Checkout {@Overridepublic void checkout(Towel towel) {System.out.println("人工结账毛巾");}@Overridepublic void checkout(Cookie cookie) {System.out.println("人工结账饼干");}@Overridepublic void checkout(Yogurt yogurt) {System.out.println("人工结账酸奶");}
}
package com.learning.visitor.shop;// 自动结账类
public class AutoCheckout implements Checkout {@Overridepublic void checkout(Towel towel) {System.out.println("自动结账毛巾");}@Overridepublic void checkout(Cookie cookie) {System.out.println("自动结账饼干");}@Overridepublic void checkout(Yogurt yogurt) {System.out.println("自动结账酸奶");}
}
5.2.5 抽象元素
  • 1.定一个物品接口,声明一个接收一个结账方式的方法
  • 2.表明是哪种方式结账,其中方法的参数即收银台为被接受访问者
 package com.learning.visitor.shop;// 物品接口
public interface Item {void accept(Checkout checkout);double getPrice();String getName();
}  
5.2.6 具体元素
  • 1.实现accept操作,参数是一个访问者即收银台
package com.learning.visitor.shop;/*** 毛巾类*/
public class Towel implements Item{@Overridepublic void accept(Checkout checkout) {checkout.checkout(this);}@Overridepublic double getPrice() {return 5.99;}@Overridepublic String getName() {return "毛巾";}
}
package com.learning.visitor.shop;/*** 饼干*/
public class Cookie implements Item {@Overridepublic void accept(Checkout checkout) {checkout.checkout(this);}@Overridepublic double getPrice() {return 2.99;}@Overridepublic String getName() {return "饼干";}
}
package com.learning.visitor.shop;/*** 酸奶*/
public class Yogurt implements Item {@Overridepublic void accept(Checkout checkout) {checkout.checkout(this);}@Overridepublic double getPrice() {return 1.99;}@Overridepublic String getName() {return "酸奶";}
}
5.2.7 对象结构
  • 1.包含抽象元素的容器,提供让访问者对象遍历容器中所有元素的方法(List、Set、Map等)
  • 2.通过add方法,将具体的元素毛巾、饼干、酸奶放进List中
  • 3.提供遍历List中所有元素的方法action
package com.learning.visitor.shop;import java.util.ArrayList;
import java.util.List;  // 购物车类  
public class ShoppingCart {private List<Item> items = new ArrayList<>();  public void addItem(Item item) {  items.add(item);  }/*** 结账action* @param checkout*/public void action(Checkout checkout) {for (Item item : items) {item.accept(checkout);}}  
}
5.2.8 客户端类
package com.learning.visitor.shop;/*** 超市销售系统*/
public class SupermarketSystem {public static void main(String[] args) {  // 创建物品  Item towel = new Towel();  Item cookie = new Cookie();Item yogurt = new Yogurt();  // 创建购物车并添加物品  ShoppingCart cart = new ShoppingCart();  cart.addItem(towel);  cart.addItem(cookie);cart.addItem(yogurt);  // 使用人工结账  ManualCheckout manualCheckout = new ManualCheckout();cart.action(manualCheckout);// 使用自动结账  AutoCheckout autoCheckout = new AutoCheckout();  cart.action(autoCheckout);}  
}
5.2.9 结果示例

在这里插入图片描述

5.2.10 改进
  • 1.结账接口可以把购物车作为参数进行结账
// 结账接口  
interface Checkout {  void checkout(ShoppingCart cart);  
}  
// 人工结账类  
class ManualCheckout implements Checkout {  @Override  public void checkout(ShoppingCart cart) {  System.out.println("Manual Checkout");  System.out.println("Total price: " + cart.getTotalPrice());  // 在这里执行人工结账的逻辑,比如接收现金或刷卡  }  
}  
// 自动结账类  
class AutoCheckout implements Checkout {  @Override  public void checkout(ShoppingCart cart) {  System.out.println("Auto Checkout");  System.out.println("Total price: " + cart.getTotalPrice());  // 在这里执行自动结账的逻辑,比如扫描条形码或使用移动支付  }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试拼图-原理源码

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录下... 1. JS内存泄漏如何检测&#xff1f;场景有哪些? 1.1 垃圾回收 GC 垃圾回收是一种自动管理内存的机制&#xff0c;它负责在运行时跟踪内存的分配和使用情况&#xff0c;并在不再需要的对象…

理解CAE

用于自监督表示学习的上下文自动编码器 摘要 我们提出了一种新的掩模图像建模(MIM)方法&#xff0c;上下文自编码器(CAE)&#xff0c;用于自监督表示预训练。我们通过在编码的表示空间中进行预测来预训练编码器。预训练任务包括两个任务:掩模表示预测—预测掩模块的表示&…

专业145+总分410+西工大西北工业大学827信号与系统考研经验电子信息与通信工程,海航,真题,大纲,参考书。

经过一年的努力&#xff0c;分数终于出来。今年专业课827信号与系统145&#xff08;很遗憾差了一点点满分&#xff0c;没有达到Jenny老师的最高要求&#xff09;&#xff0c;数一130&#xff0c;英语和政治也都比较平衡&#xff0c;总分410分&#xff0c;当然和信息通信考研Jen…

C及C++每日练习(2)

1.选择&#xff1a; 1.使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A.%-30.4e B.%4.30e C.%-30.4f D.%-4.30 在上一篇文章中&#xff0c;提到了…

变老特效哪个app可以拍?深入探索变老效果的应用

随着科技的进步和智能手机的普及&#xff0c;各种摄影应用如雨后春笋般涌现&#xff0c;为我们提供了前所未有的创意拍摄体验。其中&#xff0c;变老特效因其独特的魅力&#xff0c;吸引了众多用户的关注。这种特效能够让我们在短时间内看到自己老去的模样&#xff0c;既有趣又…

JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码

J2EE&#xff08;Java 2 Platform Enterprise Edition&#xff09;是指“Java 2企业版”&#xff0c;B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在日常的生活中&#xff0c;经常会使用…

强大的ps 命令 -o 自定义输出内容选项

强大的ps 命令 -o 自定义输出内容选项 1、ps命令介绍和作用2、问题描述 1、ps命令介绍和作用 ps 是一个 Unix 和类 Unix 操作系统中常用的命令&#xff0c;用于显示当前运行的进程信息。ps 命令的作用包括&#xff1a; 查看进程信息&#xff1a; ps 命令可以列出当前系统中正…

力扣每日一题:Dijkstra1976.到达目的地的方案数

本题是在非负权值图中求解最短路径&#xff0c;典型的Dijkstra算法的应用&#xff0c;只不过在求解最短路径时&#xff0c;还需要记录最短路径数目。这个又涉及到一点动态规划的思想。 考虑一个点u&#xff0c;原点到u的最短路径为dis[u]&#xff0c;最短路径数目为ways[u]&…

算法D30 | 回溯算法6 | 332.重新安排行程 51. N皇后 37. 解数独

详细布置 今天这三道题都非常难&#xff0c;那么这么难的题&#xff0c;为啥一天做三道&#xff1f; 因为 一刷 也不求大家能把这么难的问题解决&#xff0c;所以 大家一刷的时候&#xff0c;就了解一下题目的要求&#xff0c;了解一下解题思路&#xff0c;不求能直接写出代码…

数据结构之顺序表及其实现!

目录 ​编辑 1. 顺序表的概念及结构 2. 接口的实现 2.1 顺序表的初始化 2.2 检查顺序表容量是否已满 2.3 顺序表的尾插 ​编辑 2.4 顺序表的尾删 2.5 顺序表的头插 2.6 顺序表的头删 2.7 顺序表在pos位置插入 2.8 顺序表在pos位置删除 2.9 顺序表的查找 2.10 顺…

探秘RestTemplate:解析远程调用的神奇力量(二)

本系列文章简介&#xff1a; 本系列文章将深入探讨RestTemplate的原理及其应用。我们将从RestTemplate的工作原理开始&#xff0c;解析其内部机制和工作流程。然后&#xff0c;我们将介绍RestTemplate的核心功能和特点&#xff0c;以及它在不同场景下的应用。我们还将为您提供一…

数据分析Pandas专栏---第十三章<Pandas训练题(初)>

前言: 写这篇是为了弄一个富有挑战性的Pandas练习题库&#xff0c;涵盖了许多常见和实用的数据处理问题。通过解决这些练习&#xff0c;能够深入了解Pandas提供的关键功能&#xff0c;掌握有效处理数据的技巧和方法。 练习题库涵盖了选择特定列并创建新DataFrame、对DataFrame进…

考研数学——高数:多元函数微分法及其应用

因为复习阶段全篇很细节的写下来一来比较费时间&#xff0c;二容易导致为了记笔记而记。 接下来的内容只会保留上课中比较有意义的地方&#xff0c;以及有自己助于理解的想法 全微分 助记&#xff1a; 证明是否可微&#xff0c;首先判断两个偏导数是否存在&#xff0c;不存在则…

中文版国产Figma简单好上手

在过去的两年里&#xff0c;国内外协同办公室发展迅速。一方面&#xff0c;它是由突如其来的疫情推动的&#xff0c;另一方面&#xff0c;它是科学技术不断进步的必然结果。在市场的推动下&#xff0c;市场上出现了越来越多的协同办公软件&#xff0c;使工作场所的工作更加高效…

插入排序和归并排序

插入排序&#xff0c;Insertion Sort. 给出伪代码 for i 1,2,...,n-1Insert A[i] into Sorted array A[0:i-1]by swaping down to the correct position. 冒泡排序 冒泡排序就是一种插入排序算法。 i ← 1 while i < length(A)j ← iwhile j > 0 and A[j-1] > A…

POST和GET传值的方法

区别&#xff1a; 1. Get是从服务器上获取数据&#xff0c;Post是向服务器传送数据。 2. Get是把参数数据队列加到提交表单的action属性所指的url中 值和表单内各个字段一一对应&#xff0c;在url中可以看到。Post是通过http中的 Post机制&#xff0c;将表单内各个字段与其内…

CorelDRAW2024专业级图形设计矢量图形设计软件

CorelDRAW2024是一款功能强大的矢量图形设计软件&#xff0c;适用于专业级图形设计作品的设计师和创作者。它提供了智能对象、布局、插图和模板等功能&#xff0c;可以帮助用户快速创建高质量的设计作品。 这款软件的用户界面直观且易于使用&#xff0c;允许用户快速访问和管理…

[渗透教程]-024-Hashcat密码破解

Hashcat 简介 Hashcat 自称是世界上最快的密码恢复工具。它在2015年之前拥有专有代码库,但现在作为免费软件发布。适用于 Linux,OS X 和 Windows 的版本可以使用基于 CPU 或基于 GPU 的变体。支持 hashcat 的散列算法有 Microsoft LM hash,MD4,MD5,SHA 系列,Unix 加密格…

Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin:x.x.x报错

Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin:x.x.x报错 环境 springboot 2.6.3 IDEA 2021.2.3 解决办法 清除IDEA缓存并重启给spring-boot-maven-plugin指定版本号后重新索引再删除版本号

184基于matlab的相关向量机(RVM)回归和分类算法

基于matlab的相关向量机&#xff08;RVM&#xff09;回归和分类算法。该算法基于贝叶斯稀疏核⽅法&#xff0c;避免了支持向量机&#xff08;SVM&#xff09;的主要局限性。RVM关键是为每个权参数 都引入一个单独的超参数 &#xff0c;而不是一个共享超参数。程序已调通&#x…