首页 > 其他分享 >20230430 28. 访问者模式 - 男女对比

20230430 28. 访问者模式 - 男女对比

时间:2023-06-22 14:56:10浏览次数:31  
标签:20230430 getClass void 28 class getSimpleName public 访问者

介绍

访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

访问者模式

访问者模式适用于数据结构相对稳定的系统

访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的増加变得容易。

访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

访问者的缺点其实也就是使增加新的数据结构变得困难了。

访问者模式的能力和复杂性是把双刃剑,只有当你真正需要它的时候,才应该考虑使用它

代码示例

Element

public abstract class Person {
    public abstract void accept(Action action);
}

Element 实现类

public class Man extends Person {
    @Override
    public void accept(Action action) {
        action.getManConclusion(this);
    }
}


public class Woman extends Person {
    @Override
    public void accept(Action action) {
        action.getWomanConclusion(this);
    }
}

Visitor

public abstract class Action {
    public abstract void getManConclusion(Man man);
    public abstract void getWomanConclusion(Woman woman);
}

Visitor 实现类

public class Success extends Action {
    @Override
    public void getManConclusion(Man man) {
        System.out.println(man.getClass().getSimpleName()
                + " " + this.getClass().getSimpleName() + "时,背后多半有一个伟大的女人。");

    }

    @Override
    public void getWomanConclusion(Woman woman) {
        System.out.println(woman.getClass().getSimpleName()
                + " " + this.getClass().getSimpleName() + "时,背后多半有一个伟大的女人。");
    }
}


public class Failing extends Action {
    @Override
    public void getManConclusion(Man man) {
        System.out.println(man.getClass().getSimpleName()
                + " " + this.getClass().getSimpleName() + "时,闷头喝酒,谁也不用劝。");
    }

    @Override
    public void getWomanConclusion(Woman woman) {
        System.out.println(woman.getClass().getSimpleName()
                + " " + this.getClass().getSimpleName() + "时,眼泪汪汪,谁也劝不了。");
    }
}

对象结构

public class ObjectStructure {
    private List<Person> elements = new ArrayList<>();

    public void add(Person person) {
        elements.add(person);
    }

    public void remove(Person person) {
        elements.remove(person);
    }

    public void accept(Action action) {
        for (Person person : elements) {
            person.accept(action);
        }
    }
}

客户端

public class Test {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new Man());
        objectStructure.add(new Woman());

        objectStructure.accept(new Success());
        System.out.println("*************************");
        objectStructure.accept(new Failing());
    }
}

标签:20230430,getClass,void,28,class,getSimpleName,public,访问者
From: https://www.cnblogs.com/huangwenjie/p/17490424.html

相关文章

  • 20230428 24. 职责链模式 - 审批流程
    介绍职责链模式(ChainofResponsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Handler类,定义一个处理请示的接口ConcreteHandler类,具体处理者类,处理它所负责的请......
  • 20230430 26. 享元模式 - 网站复用
    介绍享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。事实上,享元模式可以避免大量非常相似类的开销。在程序设计中,有时需......
  • 20230430 27. 解释器模式 - 音符
    解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器......
  • [Leetcode] 0728. 自除数
    728.自除数点击上方,跳转至leetcode题目描述自除数 是指可以被它包含的每一位数整除的数。例如,128是一个自除数,因为 128%1==0,128%2==0,128%8==0。自除数不允许包含0。给定两个整数 left 和 right,返回一个列表,列表的元素是范围 [left,right] 内......
  • TMS320F28335光伏并网逆变器生产资料(另有离网状态 ),包含(原理图/PCB/
    TMS320F28335光伏并网逆变器生产资料(另有离网状态),包含(原理图/PCB/源代码,说明文挡),无实物。YID:3128609798582139......
  • bzoj 2839. 集合计数 二项式反演
    集合计数设fi表示恰好交集为k的方案数。设gi表示交集至少为k的方案数。\(g_i=\sum_{j=i}^{n}C(j,i)f_j\)由二项式反演得:\(f_k=\sum_{i=k}^{n}(-1)^{i-k}C(i,k)g_i\)考虑\(g_i\)的求出,钦定\(i\)个数必选那么剩下\(n-i\)个数每个数可选可不选\(2^{n-i}\)但这道题我们选出的......
  • 西门子828D 840Dsl数控程序PLC西门子数控程序中文注释,详细解释介绍。
    西门子828D840Dsl数控程序PLC西门子数控程序中文注释,详细解释介绍。对于维修人员,或者想学习PLC编程的工程师,初学者。西门子828D和840Dsl是西门子公司生产的数控系统,用于控制机床的运动和加工过程。这些系统具有强大的功能和灵活性,适用于各种工业领域。PLC(可编程逻辑控制器)是一种......
  • 基于DSP2812控制永磁同步电机调速系统的仿真和程序仿真波形正确,程序运行调试正确
    基于DSP2812控制永磁同步电机调速系统的仿真和程序仿真波形正确,程序运行调试正确涉及到的知识点和领域范围是控制系统和数字信号处理(DSP)。控制系统是用来管理和操控其他系统的一种系统,而数字信号处理则是对数字信号进行处理和分析的技术。在这段话中,描述了基于DSP2812控制永磁同步......
  • RT-THREAD的SFUD驱动简介基于W25Q128
    SFUD简介SFUD是一款开源的串行SPIFlash通用驱动库。详细介绍可查看官方说明,作为一个通用的中间套件,帮用户屏蔽了底层的FLASH操作,也方便用户使用不同的FLASH时进行移植。只需要配置好SPI就可以完成驱动的移植。FLASH特点FLASH写的时候,只能从1写到0,而不能从0写到1。因此写之......
  • [AGC028D] Chords
    [AGC028D]Chords题意:给定一个圆,圆上均等地放着 2n2n 个点,已有 kk 对点之间连好了线段,从中选择剩下 n−kn−k 对点随意连线段(每个点只连一条线段).两点联通当且仅当两点在同一条线段上或两点所属于的线段相交,求所有连边方案中,联通块的个数和. 对于圆/正多边......