行为型设计模式-访问者模式
来源:互联网 发布:文华期货仿真交易软件 编辑:程序博客网 时间:2024/06/05 21:20
访问者模式:
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式参与角色:
抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。
访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式dd。
结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色。
抽象元素类: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收银员的访问,然后收银员读取商品的信息进行相应处理。
0 0
- 设计模式 - 行为型模式 - 访问者模式
- 设计模式->行为型模式->访问者模式
- 设计模式-行为-访问者
- 设计模式--行为型--访问者模式
- 设计模式18:访问者模式【行为型】
- [设计模式-行为型]访问者模式(Vistor)
- 设计模式-行为型之访问者模式
- 行为型设计模式-访问者模式
- 设计模式---行为类型---访问者
- 设计模式深入学习--Visitor 访问者模式(行为型模式)
- Java设计模式之行为型模式(访问者模式)
- 设计模式--访问者模式(行为类模式)
- 行为型模式---访问者模式
- 行为型模式-访问者模式
- 设计模式笔记(24)---访问者模式(行为型)
- 设计模式(23)-行为型-访问者模式(Visitor)
- java设计模式(行为型)之访问者模式
- 设计模式--访问者模式Visitor(行为型)
- 欢迎使用CSDN-markdown编辑器
- RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
- 关于Eureka服务调用服务不通问题的查找
- excel操作之poi-ooxml
- aar jar repeat
- 行为型设计模式-访问者模式
- Zabbix自定义模板监控TCP连接数
- android事件分发机制
- cython笔记:调用C++类时,如果不实现析构函数,会有什么样的后果
- 获取构造器
- 文本处理工具
- 正则表达式及应用
- 56. Merge Intervals
- Android程序员学PHP开发(34)-ThinkPHP5.0(6)自动生成-PhpStorm