行为型设计模式-访问者模式

来源:互联网 发布:文华期货仿真交易软件 编辑:程序博客网 时间: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
原创粉丝点击