zoukankan      html  css  js  c++  java
  • 设计模式之访问者模式

    题目

    [实验任务一]:打包员
    在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
    类图:

    类图

    Java

    Product

    package com.gazikel;
    
    public interface Product {
    
        void accept(Visitor visitor);
    }
    

    Product实现类

    Apple

    package com.gazikel;
    
    public class Apple implements Product {
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }
    

    Book

    package com.gazikel;
    
    public class Book implements Product {
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }
    

    Visitor

    package com.gazikel;
    
    
    
    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);
    }
    

    Visitor实现类

    Customer

    package com.gazikel;
    
    public class Customer extends Visitor {
        @Override
        public void visit(Apple apple) {
            System.out.println("顾客" + name + "选苹果");
        }
    
        @Override
        public void visit(Book book) {
            System.out.println("顾客" + name + "买书");
        }
    }
    

    Packer

    package com.gazikel;
    
    public class Packer extends Visitor {
        @Override
        public void visit(Apple apple) {
            System.out.println("打包员" + name + "给苹果打包");
        }
    
        @Override
        public void visit(Book book) {
            System.out.println("打包员" + name + "给书打包");
        }
    }
    

    Saler

    package com.gazikel;
    
    public class Saler extends Visitor {
        @Override
        public void visit(Apple apple) {
            System.out.println("收银员" + name + "给苹果过秤,然后计算其价格");
        }
    
        @Override
        public void visit(Book book) {
            System.out.println("收银员" + name + "直接计算书的价格");
    
        }
    }
    

    BuyBasket

    package com.gazikel;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class BuyBasket {
    
        private List<Product> products = new ArrayList();
    
        public void accept(Visitor visitor) {
            for (Product product : products) {
                product.accept(visitor);
            }
        }
    
        public void addProduct(Product p) {
            products.add(p);
        }
    
        public void removeProduct(Product p) {
            products.remove(p);
        }
    }
    

    Client

    package com.gazikel;
    
    public class Client {
    
        public static void main(String[] args) {
            BuyBasket buyBasket = new BuyBasket();
    
            buyBasket.addProduct(new Apple());
            buyBasket.addProduct(new Book());
    
            Visitor saler = new Saler();
            saler.setName("张三");
            System.out.println("----收银员----");
            buyBasket.accept(saler);
    
            Visitor packer = new Packer();
            packer.setName("李四");
            System.out.println("----打包员----");
            buyBasket.accept(packer);
    
            Visitor customer = new Customer();
            customer.setName("王五");
            System.out.println("----顾客----");
            buyBasket.accept(customer);
        }
    }
    

    C++

    main.cpp

    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    class Product;
    class Book;
    class Apple;
    
    class Visitor
    {
    protected:
    	string name;
    public:
    	void SetName(string name) {
    		this->name = name;
    	}
    	virtual void Visit(Apple *apple) {};
    	virtual void Visit(Book *book) {};
    };
    
    
    class Product
    {
    public:
    	// Methods
    	virtual void Accept(Visitor *visitor) {};
    };
    
    
    // "ConcreteElement"
    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 Customer : public Visitor {
    public:
    	void Visit(Book *book) {
    		cout << "顾客" << name << "买书" << endl;
    	}
    
    	void Visit(Apple *apple) {
    		cout << "顾客" << name << "选苹果" << endl;
    	}
    };
    
    class Saler : public Visitor {
    public:
    	void Visit(Book *book) {
    		cout << "收银员" << name << "直接计算书的价格" << endl;
    	}
    
    	void Visit(Apple *apple) {
    		cout << "收银员" << name << "给苹果过秤,然后计算其价格" << endl;
    	}
    };
    
    class Packer : public Visitor {
    public:
    	void Visit(Book *book) {
    		cout << "打包员" << name << "给书打包" << endl;
    	}
    
    	void Visit(Apple *apple) {
    		cout << "打包员" << name << "给苹果打包" << endl;
    	}
    };
    
    
    // "ObjectStructure"
    class BuyBasket
    {
    private:
    	list<Product*> products;
    
    public:
    
    	void Attach(Product *product)
    	{
    		products.push_back(product);
    	}
    
    	void Detach(Product *product)
    	{
    		products.remove(product);
    	}
    
    	void Accept(Visitor *visitor)
    	{
    		for (std::list<Product*>::iterator it = products.begin(); it != products.end(); ++it)
    			(*it)->Accept(visitor);
    	}
    };
    
    int main()
    {
    	BuyBasket *buybasket = new BuyBasket();
    
    	Product* apple = new Apple();
    	Product* book = new Book();
    
    	buybasket->Attach(apple);
    	buybasket->Attach(book);
    
    	Customer *customer = new Customer();
    	customer->SetName("张三");
    	Saler* saler = new Saler();
    	saler->SetName("李四");
    	Packer* packer = new Packer();
    	packer->SetName("王五");
    
    	// Employees are visited
    	cout << "----customer----" << endl;
    	buybasket->Accept(customer);
    
    	cout << "----saler----" << endl;
    	buybasket->Accept(saler);
    
    	cout << "----packer----" << endl;
    	buybasket->Accept(packer);
    }
    
  • 相关阅读:
    期待着一个目标 和一个新生
    做一个真正意志坚强的人
    从猫叫、老鼠跑和人醒看观察者模式
    再看C++(6)操作符重载
    英尺
    再看C、C++、数据结构(三)
    一道比较有意思的打印题(不需要会很多计算机语言知识,简单的C就行)
    再看C++(四)const的终极使用
    再看C、C++、数据结构(二)
    再看C语言和数据结构(一)
  • 原文地址:https://www.cnblogs.com/Gazikel/p/15613826.html
Copyright © 2011-2022 走看看