访问者模式
实验 25:访问者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解访问者模式的动机,掌握该模式的结构;
2、能够利用访问者模式法解决实际问题。
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
类图
源代码
public interface Product { void accept(Visitor visitor); } public class Apple implements Product{ @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visit(this); } } public class Book implements Product{ @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub 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 Customer extends Visitor{ @Override public void visit(Apple apple) { // TODO Auto-generated method stub System.out.println("顾客"+name+"选苹果。"); } @Override public void visit(Book book) { // TODO Auto-generated method stub System.out.println("顾客"+name+"买书。"); } } public class Packer extends Visitor{ @Override public void visit(Apple apple) { // TODO Auto-generated method stub System.out.println("打包员"+name+"给苹果打包。"); } @Override public void visit(Book book) { // TODO Auto-generated method stub System.out.println("打包员"+name+"给书打包。"); } } public class Saler extends Visitor{ @Override public void visit(Apple apple) { // TODO Auto-generated method stub System.out.println("收银员"+name+"给苹果过秤,然后计算其价格"); } @Override public void visit(Book book) { // TODO Auto-generated method stub System.out.println("收银员"+name+"直接计算书的价格。"); } } 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 Client { public static void main(String[] args) { // TODO Auto-generated method stub 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=new Customer(); visitor.setName("张三"); basket.accept(visitor); System.out.println("----------------------------"); visitor=new Packer(); visitor.setName("李四"); basket.accept(visitor); System.out.println("----------------------------"); visitor=new Saler(); visitor.setName("王五"); basket.accept(visitor); } }