首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计模式实战-访问者模式,减少代码体积

3、访问者模式代码实现 3.1 抽象访问者 // 抽象的访问者角色,需要针对每个被访问元素都定义一个接口 public interface Visitor { void visit(ConcreteElementA...访问者模式的缺点: 元素变更时会导致整个代码都要调整。 5、应用场景 访问者模式的典型应用场景如下: 对象的结构(元素)比较稳定,而访问者频繁变动的场景; 数据操作和数据结构分离的场景。...6、使用实例 还是以文章开始讲的 Root 用户和普通用户访问文件或文件夹为例,下面我们以访问者模式来实现一下: 6.1 抽象的访问元素 // 被访问的元素 interface Element {...7、总结 访问者模式适应于元素种类基本不变但是 visit 行为变化的场景,或者说访问者不断增加的场景,访问者增加时我们只需要增加新的访问者类即可,一定程度上避免了在 visit 上进行 if…else...的繁杂逻辑判断,减少了代码体积

35420

优秀代码---改善代码三部曲:重构、设计模式重构模式

一、改善代码的三部曲 《设计模式》-> 《重构》-> 《重构模式》。也就是设计->重构->重构出新设计,改善代码的三部曲: 第一部曲?...第二种使用模式的方式就是重构,因为是要在不增加系统特性或者不改变其外部行为的情况下改变系统的设计。...二、重构模式的缘由 应该通过重构实现模式、趋向模式和去除模式(refactoring to, towards, and away from pattern),而不是在预先设计中使用模式,也不再过早的在代码中加入模式...过度设计 :代码的灵活性和复杂性超出所需。有些开始设计的时候,认为某些地方会频繁的改动,甚至开始使用了某种设计模式预留扩展, 但是后来却没怎么动,也就是导致了废设计和功能. 2....“迅速而又从容不迫” 使用测试驱动开发和持续重构的益处: 1)保持较低的缺陷数量 2)大胆的进行重构 3)得到更加简单、更加优秀的代码 4)编程时没有压力

36740
您找到你想要的搜索结果了吗?
是的
没有找到

项目重构--使用策略模式

大家先看下下面这段代码有什么感受?...,层次不清晰,过多的判断,扩展性差.....真的快看不下去了.所以决定重构下.因为最近在学设计模式,仔细分析下,这不正好策略模式很像吗?...再看下策略模式的定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。...好,我们对策略模式稍微有了了解,那我们开始重构这段代码: 首先讲下这段代码要实现的功能,他主要是刷卡功能的实现,有就诊卡,银行卡,医保卡等,每种卡对应不同的刷卡器,同时对应不同的信息提示与背景显示等....} Common.CommWindow.EndProgressBar(); return error; } } 重构代码量减少了将近一半以上

87190

使用策略模式重构ifelseifelseif

medium.com/aia-sg-techblog/refactor-if-elseif-elseif-using-strategy-design-pattern-80c51913a539 ---- 策略设计模式是一种允许在运行时选择算法的行为...这种模式 定义了一系列算法 封装每种算法 使算法在该系列内可互换。 下面是策略设计模式的架构,客户端将在其中与上下文进行通信。...让我们检查一下如何使用以下场景重构旧式 if else 语句。 这种设计的问题在于,每当我们需要添加或修改任何传输方式时,它总是会影响业务逻辑的实现。 让我们使用策略设计模式重构紧密耦合的代码。...策略接口及其实现 上下文对象持有策略参考 客户端代码如下所示 优点: 添加新策略不会干扰之前的任何代码。 移除/重构之前的任何策略都是灵活的。 易于单一测试。 ·END·

11220

使用策略模式重构 ifelseifelseif

medium.com/aia-sg-techblog/refactor-if-elseif-elseif-using-strategy-design-pattern-80c51913a539 策略设计模式是一种允许在运行时选择算法的行为...这种模式 定义了一系列算法 封装每种算法 使算法在该系列内可互换。 下面是策略设计模式的架构,客户端将在其中与上下文进行通信。...让我们检查一下如何使用以下场景重构旧式 if else 语句。 这种设计的问题在于,每当我们需要添加或修改任何传输方式时,它总是会影响业务逻辑的实现。 让我们使用策略设计模式重构紧密耦合的代码。...策略接口及其实现 上下文对象持有策略参考 客户端代码如下所示 优点: 添加新策略不会干扰之前的任何代码。 移除/重构之前的任何策略都是灵活的。 易于单一测试。

15400

访问者模式

访问者模式 访问者模式Visitor Pattern中属于行为型模式,针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法,元素的执行算法可以随着访问者改变而改变,主要意图在于将数据结构与数据操作分离...描述 在面向对象编程和软件工程中,访问者设计模式是一种将算法与它所运行的对象结构分离的方法,这种分离的实际结果是能够在不修改现有对象结构的情况下向现有对象结构添加新操作,这是遵循开放封闭原则的一种方式。...优点 符合单一职责原则,凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的...适用环境 假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,为了避免这些操作污染这个对象,则可以使用访问者模式来把这些操作封装到访问者中去。...假如一组对象中,存在着相似的操作,为了避免出现大量重复的代码,也可以将这些重复的操作封装到访问者中去。 实现 // 以动物园模拟为例,我们有几种不同种类的动物,它们能够发出不同的声音。

49200

访问者模式

// 展示报表的访问者 ISVisitor showVisitor = new Visitor(); // 汇总报表的访问者 ITotalVisitor...是重写的时候就断定要绑定那个,例如定义年轻演员的时候,重写的act方法,此时为静态绑定了KungFuRole, 动态绑定呢,act方法,只有在运行的时候才能判断是和那个绑定 一个演员可以扮演多个角色,如何实现呢,使用访问者模式...,演员使用抽象类。...接口,抽象类 接口呢 是在运行的时候才能发现,所以使用动态绑定,抽象类适合使用静态绑定。啊哈,这就是接口和抽象类的区别。...访问者模式的核心在于定义一个方法,就像开启一个门,让访问者进入,然后在将其信息传递给访问者,由访问者执行需要产生的内容。

43650

访问者模式

概念 访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。...访问者模式的特点及适用场合 访问者模式具有以下的几个特点: 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。 访问者模式适用于数据结构相对稳定算法又易变化的系统。...因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。...访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。 适用场合 在以下情况中我们会考虑使用访问者模式: 1....代码实例 元素角色(Element) public interface Subject { /** 接受将要访问它的对象 */ void accept(Visitor visitor

84350

设计模式---访问者模式

访问者模式 介绍 定义及使用场景 UML类图 角色 财务案例 个人心得体会 静态分派以及动态分派 静态分派 动态分派 访问者模式中的伪动态双分派 对访问者模式的一些思考 总结 优点 缺点 适用性 参考文章...,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果这样则不适合使用访问者模式。...如果没使用访问者模式,一定会增加许多if else,而且每增加一个访问者,你都需要改你的if else,代码会显得非常臃肿,而且非常难以扩展和维护。...---- 访问者模式中的伪动态双分派 访问者模式使用的是伪动态双分派,所谓的动态双分派就是在运行时依据两个实际类型去判断一个方法的运行行为,而访问者模式实现的手段是进行了两次动态单分派来达到这个效果。...3、有时在对数据结构上的元素进行操作的时候,需要区分具体的类型,这时使用访问者模式可以针对不同的类型,在访问者类中定义不同的操作,从而去除掉类型判断。 ---- 参考文章 设计模式学习之访问者模式

35520

访问者模式

让自己的内心藏着一条巨龙,既是一种苦刑,也是一种乐趣——雨果 今天跟着一个网站学了学访问者模式 简单来说,如果我们要在不改动现有逻辑的情况下对类进行增强,则可以使用访问者模式 真实世界类比...我们这里有多栋建筑,但我们不能在建筑类中写推销保险的代码,并且尽可能考虑未来拓展性 当设计完成后,此时此刻突然来了是送外卖的,我们现在再改动原有每个建筑的代码了,工作量就会太多。。。...我们尝试用访问者模式去完成这样一个案例: 建筑接口 package com.ruben.vistor.example.Insurance; /** * 建筑 * * @author <achao1441470436...,前面两个函数是我们需要具体执行的函数,第三个函数则是提供一个入口,让建筑能够被人访问 它的参数里是一个Person类,对应人 我们现在先来实现这个Building接口,写出居民楼、银行、咖啡厅的代码...,即可让外卖员自己根据传入的建筑执行不同的逻辑 执行结果 访问者模式优缺点 优点: 1.开闭原则。

30010

访问者模式

概要 访问者模式是一种将数据结构与数据操作分离的设计模式。它允许你定义新的操作,而无需改变所操作的元素类。该模式的核心思想是,通过一个访问者类,可以访问不同类的元素,而不用关心这些元素的具体类。...适用场景: 当一个对象结构包含很多类,而你希望对这些类实施一些依赖其具体类的操作时,使用访问者模式。 当需要对一个对象结构中的对象进行很多不同并且不相关的操作时,使用访问者模式。...当类的结构改变较少,但经常需要在此结构上定义新的操作时,使用访问者模式。 优点: 新增操作方便:可以在不修改现有代码的情况下,增加新的操作,符合开闭原则。...元素类与操作分离:访问者模式将数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。 缺点: 具体元素对访问者公开:访问者模式使得具体元素对访问者公开,暴露了元素的细节,破坏了封装性。...详细内容 代码示例 interface Element { void Accept(Visitor visitor); } class ConcreteElementA : Element {

11620

设计模式-访问者模式

定义 访问者模式(Visitor Pattern):在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。...这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。许你通过访问者对象来获取或修改一个或多个被保护的对象的 state。...访问者模式的关键点如下: 定义一个访问者对象,它包含一个或多个对象。 定义一个接口,用于定义访问者对象的操作。 在接口中声明一个方法,用于获取对象的状态。 在接口中声明一个方法,用于修改对象的状态。...访问者模式是一种非常有用的设计模式,它可以帮助我们抽象出对象之间的访问关系,并可以方便地实现多态。访问者模式的应用场景包括但不限于: 需要对外部用户进行状态持久化存储的对象,如数据库中的记录。...Override public void visit(Monitor monitor) { Log.e("---", "Displaying Monitor."); } } 使用

14740

设计模式--访问者模式

访问者模式是一种行为型设计模式,它允许你将算法从其操作的对象结构中分离出来。在访问者模式中,你可以声明一个抽象的访问者类型,其定义了一组访问操作API。具体的访问者类实现了这些操作。...结构体系可以通过在元素类中声明抽象的访问者接口并使用接口进行多态性引用来支持访问者。...以下是一个使用C#实现访问者模式的示例:using System;using System.Collections.Generic;// 访问者接口interface IVisitor{ void...在Main函数中,我们使用ObjectStructure类构建了对象结构,并建立了具体的访问者ConcreteVisitorA和ConcreteVisitorB。...我们最后对访问者进行访问,并获得了输出结果。【小结】设计模式系列文章写完了,暂时告一段落。日常开发中,仍然需要多加留意,慢慢领会其中的奥妙之处。

21040

访问者模式

,或者管理方法,都不好做 针对上述方案的弊端引出了我们本次要讲的主题.访问者模式 访问者模式 基本概念 访问者模式(Visitor Pattern):封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作...为具体元素,实现了accept 方法 好了讲了这么多的理论知识:估计也是迷迷糊糊的,直接针对上述案例来撸代码吧,使用访问者模式解决评测系统的问题: 应用案例类图: 代码展示 Action public...System.out.println("==============="); Fail fail = new Fail(); objectStructure.display(fail); } } 以上代码就是访问者模式的简单使用...请看接下来的需求: 假设我们要添加一个Wait的状态类,考察Man类和Woman类的反应 由于使用了双分派,只需增加一个Action子类即可在客户端调用即可,不需要改动任何其他类的代码。...."); } } Client端只需要增加两行代码即可测试 Wait wait = new Wait(); objectStructure.display(wait); 到这里是不是感觉到访问者模式的优点

10110

访问者模式

一、简介 1、访问者模式表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...2、模式中的成员角色 访问者(Visitor)   :访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。...具体访问者(ConcreteVisitor):访问者的具体实现类。 元素(Element),也就是被访问者,通过accept(Visitor)方法接受Visitor的访问。...ObjectStructure本身也可以作为被访问者。 3、UML ? 4、所属类别:行为型 二、C++程序 1 // 访问者模式.cpp : 定义控制台应用程序的入口点。...(Person *)=0; 15 //virtual void print_judgement(Person *)=0; 16 17 //被访问者抽象类 18 class Person

56550

访问者模式

这是23种设计模式的最后一个——访问者模式,这个模式确实不怎么好理解,不怎么好用,而且实际中也很少用到这个设计模式。...《大话设计模式》中就提到GoF四个人中有一个说过:“大多数时候你并不需要访问者模式,但当一旦你需要访问者模式时,那就是真的需要它了。”...这时,男人和女人就是相对稳定的系统,我们将男人和女人对待事物看法不同用程序代码并且用访问者模式来表达。...,在此种场景中只有男人和女人,所以这个分类相对来说是稳定的我们才能使用访问者模式。...,访问者模式确实是现实场景不常用的模式,只有用在相对稳定的分类才能尝试使用访问者模式,千万不要生搬硬套设计模式,这样只会得不偿失。

69050

设计模式-访问者模式

以简单的module学习设计模式 前言 访问者模式是一种将数据操作与数据结构分离的设计模式使用场景: 主要解决稳定的数据结构和易变的操作耦合问题。...需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。即数据结构不变,数据发生改变适用的设计模式 ?...移除元素类,必然会导致频繁地修改Visitor接口,如果这样则不适合使用访问者模式。...访问者模式最大的优点就是增加访问者非常容易,我们从代码上来看,如果要增加一个访问者,你只需要做一件事即可,那就是写一个类,实现AccountBookViewer接口,然后就可以直接调用AccountBook...如果没使用访问者模式,一定会增加许多if else,而且每增加一个访问者,你都需要改你的if else,代码会显得非常臃肿,而且非常难以扩展和维护。 结果: ?

42530

设计模式——访问者模式

这些被处理的数据元素相对稳定,而访问方式多种多样的数据结构,如果使用访问者模式” 来处理比较方便。...访问者模式能把处理方法从数据结构中分离出来,并可以根据需要增加新的处理方式,且不用修改原来的程序代码与数据结构,这提高了代码的扩展性和灵活性。...【3】访问者模式的基本工作原理:在被访问者(上面提到的评委)的类里面加一个对外提供接待访问者的接口。...【4】访问者模式主要应用场景:需要对一个对象结构中的对象进行很多不同的操作(这些操作彼此没有关联),同时避免让这些操作 “污染” 这些类对象,可以选用访问者模式。...● 破坏封装:访问者模式中具体元素对访问者公布细节,这破坏了对象的封装性。   ● 违反了依赖倒置原则:访问模式依赖了具体类,而没有依赖抽象类。

39210
领券