文档章节

【行为型】- 访问者模式

ZeroneLove
 ZeroneLove
发布于 02/23 10:32
字数 877
阅读 22
收藏 0

访问者模式

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

角色

  • 抽象访问者:抽象类或接口,声明访问者可访问的元素,即程序中visit方法中参数定义可被访问的对象。

  • 访问者:实现抽象访问者所声明的方法,影响到访问者访问到1个类的的可做的事情。

  • 抽象元素类:接口或者抽象类,声明接受访问者访问的类,通过accept方法参数来定义。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外是允许指定能访问的类。

  • 元素类:实现抽象元素类所声明的accept方法,通常是visitor.visit(this)

  • 结构对象:1个元素的容器


抽象元素类:Goods

public interface Goods {
	
    double accept(Visitor visitor);
}

具体元素类:

public class Television implements Goods {
	
    private int count;
    private float price;

    public double accountByPiece() {
        System.out.println("电视按台计价,购买的数量为:" + getCount() + "台,购买的单价为:" + getPrice() + ",总价为:" + getCount() * getPrice());
        return getCount() * getPrice();
    }

    /**
        * 接受访问者的访问:收银员访问购物车商品信息
        */
    public double accept(Visitor visitor) {
        return visitor.visit(this);
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}
public class Wine implements Goods {

    private int count;
    private float price;

    public double accountByBottle() {
        System.out.println("酒按瓶计价,购买的数量为:" + getCount() + "瓶,购买的单价为:" + getPrice() + ",总价为:" + getCount() * getPrice());
        return getCount() * getPrice();
    }

    public double accept(Visitor visitor) {
        return visitor.visit(this);
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public float getPrice() {
        return price;
    }

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

结构对象:ShoppingCart

public class ShoppingCart {
	
	private List<Goods> list = new ArrayList<Goods>();
	
    public void add(Goods goods) {
        list.add(goods);
    }

    public void remove(Goods goods) {
        list.remove(goods);
    }

    public List<Goods> getList() {
        return list;
    }
}

抽象访问者:Visitor

public interface Visitor {
	
	double visit(Wine wine);

	double visit(Television television);
}

具体访问者:ConcreteVisitor

public class ConcreteVisitor implements Visitor {
	
	public double visit(Wine wine) {
		return wine.accountByBottle();
	}

	public double visit(Television television) {
		return television.accountByPiece();
	}
}

工具类:AccountMachine

public class AccountMachine {
   
    private double sum;  //购物车商品总金额

    /**
        * 计算购物车总的金额
        * 类比:超市收银员进行商品二维码扫描记账
        */
    public void account(List<Goods> list) {
        
        //访问者:收银员
        Visitor visitor = new ConcreteVisitor(); 
        for (int i = 0; i < list.size(); i++) {

            //购物车商品接受收银员的访问,收银员然后再调用商品的方法进行处理
            sum += list.get(i).accept(visitor); 
        }
    }

    public double getSum() {
        return sum;
    }
}

测试代码:

//实例化具体元素
Wine wine = new Wine();
wine.setCount(10);
wine.setPrice(20f);

Television television = new Television();
television.setCount(1);
television.setPrice(2000f);

//封装结构体对象:购物车放商品
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.add(wine);
shoppingCart.add(television);

AccountMachine accountMachine = new AccountMachine();

//结构体对象操作:收银台的收银员记账
accountMachine.account(shoppingCart.getList());  

System.out.println("本次购物车内所有物品的总价为:" + accountMachine.getSum());

通俗解释:

顾客去超市买商品(元素),放入购物车(结构对象),接着去收银台结账,收银员扫码商品,得到总价,该过程收银员充当访问者角色,商品接受(accept)收银员的访问,然后收银员读取商品的信息进行相应处理。

© 著作权归作者所有

ZeroneLove
粉丝 5
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
设计原则和设计模式_Index

设计原则 1.1 什么是设计原则 ?(https://my.oschina.net/jimilee/blog/732569) 1.2 设计原则如何用? 1.3 设计原则详解 1.4 30分钟快速理解面向对象设计原则 2. 设计模式 2.1 什么时候使用设...

无寄语
2016/08/14
1
0
设计模式之访问者模式(行为型)

[TOC] 模式定义 访问者模式:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。所以访问者模式是一种对象行为型模式。 模式角...

smileNicky
03/14
0
0
访问者模式

1 场景问题 1.1 扩展客户管理的功能 考虑这样一个应用:扩展客户管理的功能。 既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,...

ciyo_yang
2017/07/15
0
0
访问者模式(Visitor)

访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数...

Carbenson
2015/09/14
28
0
设计模式(行为型模式)——访问者模式(Visitor)

访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数...

小风89
2016/07/21
30
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro 兼容 h5 踩坑指南

最近一周在改造 公羊阅读🐏 Taro 版本适配 h5 端,过程中改改补补,好不酸爽。 本文记录📝遇到的问题,希望为有相同需求的哥们👬节约点时间。 Taro 版本:1.3.9。 client_mobile_taro...

dkvirus
今天
4
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
3
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部