访问者模式实践复习

上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。

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);
    }

 

posted @ 2022-03-18 20:42  好吗,好  阅读(42)  评论(0)    收藏  举报