行为型模式之十——访问者模式

模式定义

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

模式结构

这里写图片描述

  1. Visitor
    抽象访问者为对象结构类中每一个具体元素类声明一个访问操作,从这个操作的名称或参数类型可以清楚知道需要访问的具体元素的类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。

  2. ConcreteVisitor
    具体访问者实现了每个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。

  3. Element
    抽象元素一般是抽象类或者接口,它定义一个accept()方法,该方法以一个抽象访问者作为参数。

  4. ConcreteElement
    具体元素实现了accept()方法,在其accept()中调用访问者的访问方法以便完成对一个元素的操作。

  5. ObjectStructure
    对象结构是一个元素的集合,它用于存放元素对象,并且提供了遍历其内部元素的方法。它可以结合组合模式来实施,也可以是一个简单的集合对象。

实例

顾客在超市中将选取的商品,如苹果、图书等放在购物车中,然后到收银员处付款。在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品。此时,购物车作为一个ObjectStructure用于存储各种类型的商品,而顾客和收银员作为访问这些商品的访问者,他们需要对商品进行检查和计价。不同类型的商品其访问形式也可能不同,如苹果需要过秤后再计价,而图书不需要。使用访问者模式来设计该购物过程。
实例类图如下:
这里写图片描述

public abstract class Visitor {
    protected String name;

    public void setName(String name) {
        this.name = name;
    }

    public abstract void visit(Apple apple);
    public abstract void visit(Book book);
}

public class Customer extends Visitor {
    public void visit(Apple apple) {
        System.out.println("顾客" + name + "选苹果");
    }

    public void visit(Book book) {
        System.out.println("顾客" + name + "买书");
    }
}

public class Saler extends Visitor {
    public void visit(Apple apple) {
        System.out.println("收银员" + name + "给苹果过秤,计算价格");
    }

    public void visit(Book book) {
        System.out.println("收银员" + name + "计算书的价格");
    }
}

public interface Product {
    public void accept(Visitor visitor);
}

public class Apple implements Product {
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class Book implements Product {
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

public class BuyBasket {
    private ArrayList list = new ArrayList();

    public void accept(Visitor visitor) {
        Iterator i = list.iterator();

        while (i.hasNext()) {
            ((Product)i.next()).accept(visitor);
        }
    }

    public void addProduct(Product product) {
        list.add(product);
    }

    public void removeProduct(Product product) {
        list.remove(product);
    }
}

public class Client {
    public static void main(String[] args) {
        Product b1 = new Book();
        Product b2 = new Book();
        Product a1 = new Apple();
        Visitor visitor;

        BuyBasket basket = new BuyBasket();
        basket.addProduct(b1);
        basket.addProduct(b2);
        basket.addProduct(a1);

        Visitor visitor = new Customer();
        visitor.setName("limei");

        basket.accept(visitor);
    }
}

注:至此只有解释器一种模式未讲,因为使用极少。所有模式讲解均摘抄<<设计模式>>一书,该书主编刘伟,副主编胡志刚、郭克华,清华大学出版社。个人以为这本书将得浅显易懂,适合初学者,若有初学者有不理解的地方,可以查阅此书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值