java 设计模式 示例_Java中的访问者设计模式–示例教程

java 设计模式 示例

访客模式行为设计模式之一 。 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式。 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类。

例如,假设有一个购物车,我们可以在其中添加不同类型的项目(元素),当我们单击“结帐”按钮时,它将计算要支付的总金额。 现在我们可以将计算逻辑包含在项目类中,或者可以使用访问者模式将此逻辑移到另一个类中。 让我们在访问者模式示例中实现此功能。

为了实现访客模式,首先我们将创建要在购物车中使用的不同类型的项目(元素)。

ItemElement.java

package com.journaldev.design.visitor;public interface ItemElement {public int accept(ShoppingCartVisitor visitor);
}

请注意,accept方法带有Visitor参数,我们可以有一些其他方法也特定于项目,但为简单起见,我将不讨论太多细节,而仅关注访问者模式。

让我们为不同类型的项目创建一些具体的类。

Book.java

package com.journaldev.design.visitor;public class Book implements ItemElement {private int price;private String isbnNumber;public Book(int cost, String isbn){this.price=cost;this.isbnNumber=isbn;}public int getPrice() {return price;}public String getIsbnNumber() {return isbnNumber;}@Overridepublic int accept(ShoppingCartVisitor visitor) {return visitor.visit(this);}}

水果.java

package com.journaldev.design.visitor;public class Fruit implements ItemElement {private int pricePerKg;private int weight;private String name;public Fruit(int priceKg, int wt, String nm){this.pricePerKg=priceKg;this.weight=wt;this.name = nm;}public int getPricePerKg() {return pricePerKg;}public int getWeight() {return weight;}public String getName(){return this.name;}@Overridepublic int accept(ShoppingCartVisitor visitor) {return visitor.visit(this);}}

注意具体类中accept()方法的实现,它调用Visitor的visit()方法并将其自身作为参数传递。

我们在Visitor界面中具有针对不同项目类型的visit()方法,将由具体的visitor类实现。

ShoppingCartVisitor.java

package com.journaldev.design.visitor;public interface ShoppingCartVisitor {int visit(Book book);int visit(Fruit fruit);
}

现在,我们将实现访客界面,并且每个项目都有其自己的逻辑来计算费用。

ShoppingCartVisitorImpl.java

package com.journaldev.design.visitor;public class ShoppingCartVisitorImpl implements ShoppingCartVisitor {@Overridepublic int visit(Book book) {int cost=0;//apply 5$ discount if book price is greater than 50if(book.getPrice() > 50){cost = book.getPrice()-5;}else cost = book.getPrice();System.out.println("Book ISBN::"+book.getIsbnNumber() + " cost ="+cost);return cost;}@Overridepublic int visit(Fruit fruit) {int cost = fruit.getPricePerKg()*fruit.getWeight();System.out.println(fruit.getName() + " cost = "+cost);return cost;}}

让我们看看如何在客户端应用程序中使用它。

ShoppingCartClient.java

package com.journaldev.design.visitor;public class ShoppingCartClient {public static void main(String[] args) {ItemElement[] items = new ItemElement[]{new Book(20, "1234"),new Book(100, "5678"),new Fruit(10, 2, "Banana"), new Fruit(5, 5, "Apple")};int total = calculatePrice(items);System.out.println("Total Cost = "+total);}private static int calculatePrice(ItemElement[] items) {ShoppingCartVisitor visitor = new ShoppingCartVisitorImpl();int sum=0;for(ItemElement item : items){sum = sum + item.accept(visitor);}return sum;}}

当我们运行上面的程序时,我们得到以下输出。

Book ISBN::1234 cost =20
Book ISBN::5678 cost =95
Banana cost = 20
Apple cost = 25
Total Cost = 160

请注意,如果所有项目中的accept()方法的实现都是相同的,但是可以不同,例如,可以使用逻辑检查项目是否为空,那么根本不要调用visit()方法。

访客模式类图

我们的访客模式实现的类图是:

访客模式

这种模式的好处是,如果操作逻辑发生变化,那么我们仅需要在访问者实现中进行更改,而无需在所有项目类中进行更改。

另一个好处是,将新项目添加到系统很容易,只需要在访问者界面和实现中进行更改,现有项目类就不会受到影响。

访客模式的缺点在于,在设计时我们应该知道visit()方法的返回类型,否则我们将不得不更改接口及其所有实现。 另一个缺点是,如果访问者接口的实现过多,则很难扩展。

参考: Java中的访问者设计模式 -JCG合作伙伴 Pankaj Kumar在开发人员食谱博客上的示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/visitor-design-pattern-in-java-example-tutorial.html

java 设计模式 示例

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

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

相关文章

电商商城小程序项目完整源码(微信小程序)

微信公众号:创享日记 发送:简商城 获取完整源码(导入微信开发者工具即可) 如果要较完整学习微信小程序云开发可以看看这个“云公开课”帮你了解完整的微信云托管部署流程,学习实战级的小程序开发。 1、首页 点击轮播图…

多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

接上一节 单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列) 下面再来看一下m序列与正交Gold序列在多径衰落信道下的性能。 多径信道 多径衰落信道下的仿真没有采用Jakes模型生成的Rayleigh信道,而是直接采用3径信道h=[0…

Optional.isEmpty()即将加入Java吗?

JDK-8184693请求将方法isEmpty()添加到JDK 8引入的Optional类中。 调用Optional.isEmpty()等效于调用! Optional.isPresent() ! Optional.isPresent() 。 当前没有与JDK-8184693关联的JDK版本 ,但是正如最近在core-libs-dev邮件列表中的标题为“ RFR:818…

汉字查拼音微信小程序项目源码

微信公众号:创享日记 发送:查拼音 获取完整源码(微信开发者工具导入即可用) ①基本包括全部汉字 ②支持多音字 "治":["zh","ch"],"沺":["tin"],"油":["yu"…

高斯信道、单径Rayleigh信道和多径衰落信道下基带模型的多用户BFSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

结果预览 高斯 BFSK调制方式在采用m序列时,在高斯信道下的性能仿真结果如下: BFSK调制方式在采用正交Gold序列时,在高斯信道下的性能仿真结果如下: 单径Rayleigh 采用m序列时,在单径Rayleigh信道下的性能仿真结果如下:

随机抽奖转盘微信小程序项目源码

微信小程序:创享日记 发送:抽奖转盘 获取完整源码(微信开发者工具打开即可用) 可以容易自行修改,融入自己的项目里面。 function formatTime(date) {var year date.getFullYear()var month date.getMonth() 1var d…

基带模型下基于高阶累积量的MFSK信号的调制识别(代码和参考文献见CSDN同名资源)

信号模型:基带信号 文献一:吕新正. 利用高阶累积量实现数字调制信号的自动识别[J]. 2004. 核心思想:将基带信号进行微分后在计算|C21|和|C42|的值,定义特征参数 T 4 = ∣ C 42 ∣ / ∣ C 21 ∣ 2 T 4=\left|C_{42}\right| /\left|C_{21}\right|^{2}

Java 10 –局部变量类型推断

在本文中,我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能。 从Java的第一个版本开始,它是一种强类型语言,在这里我们需要提及每种变量数据类型。 我们所有人都感到Java是冗长的语言,并期望精…

简易计算器微信小程序项目源码

微信公众号:创享日记 发送:计算器 获取完整源码(微信开发者工具导入即可用) 以下可以忽略不看! 微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用…

MongoDB初学者教程

1. MongoDB简介 在本文中,我们提供了全面的MongoDB教程,该教程与基于Java的应用程序集成。 每当我们读到NoSQL数据库时,我们都需要知道为什么在SQL数据库运行良好时会开发它们。 NoSQL的基础是通过宽松的ACID (原子性,…

手势密码解锁微信小程序项目源码

微信公众号:创享日记 发送:手势密码 获取完整源码(导入微信开发者工具即可用) 以下可以忽略不看! 手势密码就是在手机触屏上设置一笔连成的九宫格图案,登录时画一下设定的图形。 运行程序,发…

带你一步一步实战分析缓冲区溢出漏洞攻击

关注公众号有惊喜【部分付费文章免费阅读,持续更新中…】 点击公众号底部【逆向杂记】可见 文件1 (A)描述此二进制文件提供的服务,不需要运行二进制文件来找出这一点。 (B)有可能对此二进制文件进行缓冲区溢出攻击,它在哪里?哪些…

memento模式_Java中的Memento设计模式-示例教程

memento模式记忆模式是行为设计模式之一 。 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式。 使用Memento模式以这种方式实现该目的,即无法在对象外部访问对象的已保存状态数据,这可以保护已保存状态数据的完整性。 Me…

【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界(泛型的协变) 4.通配符下界(泛型的逆变) 5.泛型的编译(擦除机制) 泛型 泛型:就是让一个类能适用于多个类型,就是在封装数据结…

Python实验三:Python程序设计之组合数据类型

微信公众号:创享日记 发送:python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习…

MATLAB成形滤波、信号过信道

function [y, t] = rcosflt(x, Fd, Fs, type_flag, R, Delay, tol) 根升余弦滤波器 h = rcosdesign(alpha,6,Fs/RB,sqrt); % 根升余弦成形 h1 = rcosine(RB,Fs,fir/sqrt,alpha)

Java 10及更高版本的思考

大家好 Java 10于2018年3月20日发布。我认为许多软件团队将阻止升级。 从Java 8到Java 9的专业人员人数可能还更少。为什么会这样,原因是传统的障碍以及对应用程序服务器,框架甚至是云原生容器的依赖。 例如,如果您正在等待Spring Boot 2.0支…

Python爬虫和数据分析,石油原油加工产品产量数据处理分析

前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:原油分析 获取完整无水印报告P…

基于线性调频(LFM)信号分数阶傅里叶变换的多径时延估计

仿真信号 仿真信号为线性调频信号,信号采样率为2kHz。 线性调频(LFM)信号参数为:初始频率为300Hz,带宽400Hz,脉宽1s,调频斜率为 k ^ = − F s Δ t c o t ( p 0 ⋅ π 2 ) \hat

Python实验二:Python程序设计之结构与复用

微信公众号:创享日记 发送:python实验 获取完整清晰报告和源码以及其它资源 前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习…