访问者模式实践复习
上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
java代码
Java 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); } } import java.util.*; 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 { public void visit(Apple apple) { System.out.println("顾客" + name + "选苹果。"); } public void visit(Book book) { System.out.println("顾客" + name + "买书。"); } } public class PackgeMan extends Visitor { public void visit(Apple apple) { System.out.println("打包员" + name + "给苹果打包。"); } public void visit(Book book) { System.out.println("打包员" + name + "给书打包"); } } public interface Product { void accept(Visitor visitor); } public class Saler extends Visitor { public void visit(Apple apple) { System.out.println("收银员" + name + "给苹果过秤,然后计算其价格。"); } public void visit(Book book) { 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 a[]) { 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)XMLUtil.getBean(); visitor.setName("张三"); basket.accept(visitor); } }

c++代码
#include<iostream> #include<string> #include<list> #include"tinyxml2.h" using namespace tinyxml2; using namespace std; class Visitor; class BuyBasket; class Product; class Apple; class Book; class Product { public: virtual void accept(Visitor *visitor)=0; }; class Visitor { public: string name; public: void setName(string name) { this->name = name; } virtual void visit(Apple *apple)=0; virtual void visit(Book *book)=0; }; class Apple:public Product { public: void accept(Visitor *visitor) { visitor->visit(this); } }; class Book:public Product { public: void accept(Visitor *visitor) { visitor->visit(this); } }; class Saler :public Visitor { public: void visit(Apple *apple) { cout<<"收银员" << name << "给苹果过秤,然后计算其价格。"<<endl; } void visit(Book *book) { cout<<"收银员" << name << "直接计算书的价格。"<<endl; } }; class Customer:public Visitor { public: void visit(Apple *apple) { cout<<"顾客" << name << "选苹果。"<<endl; } void visit(Book *book) { cout<<"顾客" << name << "买书。"<<endl; } }; class PackgeMan:public Visitor { public: void visit(Apple *apple) { cout<<"打包员" <<name << "给苹果打包。"<<endl; } public: void visit(Book *book) { cout<<"打包员" << name << "给书打包"<<endl; } }; class BuyBasket{ public: void accept(Visitor *visitor){ for (auto i : list){ i->accept(visitor); } } void addProduct(Product *product){ list.push_back(product); } void removeProduct(Product *product){ list.remove(product); } private: list<Product*> list; }; int main() { 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 PackgeMan(); //visitor = (Visitor)XMLUtil.getBean(); XMLDocument xml; xml.LoadFile("config.xml"); XMLElement *category = xml.RootElement(); XMLElement *con = category->FirstChildElement("className"); const char* name = con->GetText(); visitor->setName("张三"); basket->accept(visitor); }


浙公网安备 33010602011771号