(二十一)访问者模式-代码实现

介绍

概念:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

应用场景:实体之间内部属性有差别,而且实体类型经常增加。他们的调用方式相同,但是调用的规则经常变化。

缺点:实体的特殊内容访问类需要知道。

代码:

//实体基类

package note.com.visitor;
public abstract class Food {

    public abstract void show(IVisitor visitor);
}

//具体实体

package note.com.visitor;

/**
 * 面条
 * @author Br
 *
 */

public class Noodle extends Food{
    private String price = "5块";
    private String image = "***";
    private String foodA = "营养1";
    private String foodB = "营养2";
    private String foodC = "营养3"; 

    @Override
    public void show(IVisitor visitor) {
        visitor.show(this);

    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getFoodA() {
        return foodA;
    }

    public void setFoodA(String foodA) {
        this.foodA = foodA;
    }

    public String getFoodB() {
        return foodB;
    }

    public void setFoodB(String foodB) {
        this.foodB = foodB;
    }

    public String getFoodC() {
        return foodC;
    }

    public void setFoodC(String foodC) {
        this.foodC = foodC;
    }

}
package note.com.visitor;

/**
 * 米
 * @author Br
 *
 */
public class Rice extends Food{

    private String price = "2块";
    private String image = "&&&";
    private String foodA = "营养1";
    private String foodD = "营养2";
    private String foodE = "营养3"; 

    @Override
    public void show(IVisitor visitor) {
        visitor.show(this);
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getFoodA() {
        return foodA;
    }

    public void setFoodA(String foodA) {
        this.foodA = foodA;
    }

    public String getFoodD() {
        return foodD;
    }

    public void setFoodD(String foodD) {
        this.foodD = foodD;
    }

    public String getFoodE() {
        return foodE;
    }

    public void setFoodE(String foodE) {
        this.foodE = foodE;
    }

}
package note.com.visitor;

/**
 * 汤
 * @author Br
 *
 */
public class Soup extends Food{
    private String price = "1块";
    private String image = "###";
    private String foodA = "营养1";
    private String foodF = "营养2";
    private String foodG = "营养3"; 

    @Override
    public void show(IVisitor visitor) {
        visitor.show(this);
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getFoodA() {
        return foodA;
    }

    public void setFoodA(String foodA) {
        this.foodA = foodA;
    }

    public String getFoodF() {
        return foodF;
    }

    public void setFoodF(String foodF) {
        this.foodF = foodF;
    }

    public String getFoodG() {
        return foodG;
    }

    public void setFoodG(String foodG) {
        this.foodG = foodG;
    }

}

//访问者接口定义

package note.com.visitor;

public interface IVisitor {
    public void showMenu(Food foodO);

    public void show(Noodle noodle);

    public void show(Rice rice);

    public void show(Soup soup);
}

//访问者实现

package note.com.visitor;

/**
 * 菜单显示信息(访问者:获取到被访问者,按需求显示所要的信息)
 * @author Br
 *
 */
public class Visitor implements IVisitor{

    @Override
    public void showMenu(Food food) {
        food.show(this);
    }

    //下面的方法破坏了封装特性,因为这里清楚的知道对象拥有哪些方法,属性

    public void show(Noodle noodle){
        String show = noodle.getPrice()+" "+noodle.getImage()+" "+noodle.getFoodA()+" "+noodle.getFoodB()+" "+noodle.getFoodC();
        System.out.println(show);
    }

    public void show(Rice rice){
        String show = rice.getPrice()+" "+rice.getImage()+" "+rice.getFoodA()+" "+rice.getFoodD()+" "+rice.getFoodE();
        System.out.println(show);
    }

    public void show(Soup soup){
        String show = soup.getPrice()+" "+soup.getImage()+" "+soup.getFoodA()+" "+soup.getFoodF()+" "+soup.getFoodG();
        System.out.println(show);
    }

}

//访问者与实体的组合类

package note.com.visitor;

import java.util.ArrayList;
import java.util.List;

public class Menu {
    private List<Food> list = new ArrayList<Food>();
    /*显示菜单
     *
     */
    public void showMenu(IVisitor visitor) {
        for(Food f : list){
            visitor.showMenu(f);
        }
    }

    public void addFood(Food food){
        list.add(food);
    }

}

//测试类

package note.com.visitor;

public class Test {
    public static void main(String[] args) {
        Menu menu = new Menu();
        //加入三个实体
        menu.addFood(new Noodle());
        menu.addFood(new Rice());
        menu.addFood(new Soup());
        //传入访问者获取菜单内容
        menu.showMenu(new Visitor());
    }
}

结果:

5块 *** 营养1 营养2 营养3
2块 &&& 营养1 营养2 营养3
1块 ### 营养1 营养2 营养3

好处:

1,如果要改变菜单中实体的具体显示,只需要更改访问者类的访问规则。

2,如果要加入新的实体,只需要扩展访问者类的访问规则。

时间: 2024-10-23 11:47:40

(二十一)访问者模式-代码实现的相关文章

Java设计模式菜鸟系列(二十三)访问者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40028509 访问者模式(Visitor):把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定而算法又容易变化的系统.访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者:而它的缺点就是增加新的数据结构很困难. 一.uml建模: 二.代码实现 /** * 访问者模式(Visitor):把数据结构和作用于结构上的操作解耦合,使

设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同. 例子1:顾客在超市中将选择的商品,如苹果.图书等放在购物车中,然后到收银员处付款.在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品. 此时,购物车作为一个ObjectStructure(对象结构)用于存储各种类型的商品

(二十)解释器模式-代码实现

介绍 概念:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 应用场景:语言解释器(把我们能看懂的代码转换成了难看懂的机器码) 好处:以简单的方式使用复杂的东西. 例子 //解释器 package note.com.interpreter; /** * 解释器 * @author lxz * */ public class Interpreter { public void say(String lag){ if("nh".equals(

22.设计模式_访问者模式

一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式的定义 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的耦合度降低,使得操作集合可以相对自由地改变. 数据结构的每一个节点都可以接受一个访问者的调用

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

一.访问者模式介绍 1.1 访问者模式的定义 表示一个作用于某对象结构中的各个元素的操作.它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作. 1.2 访问者模式的结构图 具体的访问者模式结构图如下所示. 这里需要明确一点:访问者模式中具体访问者的数目和具体节点的数目没有任何关系.从访问者的结构图可以看出,访问者模式涉及以下几类角色. 抽象访问者角色(Vistor):声明一个活多个访问操作,使得所有具体访问者必须实现的接口. 具体访问者角色(ConcreteVistor):实现抽象

C#设计模式(22)——访问者模式(Vistor Pattern)

一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式的定义 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的耦合度降低,使得操作集合可以相对自由地改变. 数据结构的每一个节点都可以接受一个访问者的调用

【22】访问者模式(Visitor Pattern)

一.引言 在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式的定义 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结构和作用于数据结构之上的操作之间的耦合度降低,使得操作集合可以相对自由地改变. 数据结构的每一个节点都可以接受一个访问者的调用,此节点向访问者对象传入节点对象,而访问者对象则反过来执行节点对象的操作.这样的过程叫做"双重分派&

设计模式第19篇:访问者模式

一.访问者模式介绍 定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作. 二.访问者模式代码用例 此处以购物车为例来说明,比如不同的商品有不同的结算方式,如果将商品的结算逻辑方法放在商品对象内部,则商品参加打折活动时又需要更改商品类,并且商品种类时非常多的,此时程序将变得不可维护.访问者模式就是解决这个问题,将每个商品的结算逻辑抽取出来,放在访问者(Visitor)类中,商品类中只需有接收访问者的方法accept(Visitor vi

简说设计模式——访问者模式

一.什么是访问者模式 访问者模式是一个相对比较简单,但结构又稍显复杂的模式,它讲的是表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.例如,你在朋友家做客,你是访问者,朋友接收你的访问,你通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式. 访问者模式(Visitor),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.UML结构图如下: 其中,Visitor是抽象访问者,为该