package Mode;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
/**
* 访问者模式
* 定义:表示作用于某对象结构中的各个元素的操作,它使我们不改变个元素类的情况下定义作用于这些元素的新操作
* 角色:
* 抽象访问者(vistor):为该对象结构的实例元素的每一个类声明一个操作
* 具体访问者(concreteVistor):实现抽象访问者的操作
* 抽象元素(Element):定义一个抽象的Accept操作,以一个访问者为参数
* 具体元素(concreteElement):具体的Accept操作
* 对象结构(objectStructure):对象结构,能够枚举它的元素,可以提供一个高层接口来允许访问者访问它的元素
* @author Administrator
*
*/
//抽象访问者
abstract class Visitor{
protected String name;
public void setName(String name){
this.name = name;
}
public abstract void visitor(Medicine a);
}
//具体访问者 划价员
class Charger extends Visitor{
public void visitor(Medicine a){
System.out.println("划价员:" + name +"给药" + a.getName() +"划价:" + a.getPrice());
}
}
//具体访问者 药房工作者
class Worker extends Visitor{
public void visitor(Medicine a){
System.out.println("药房工作者:" + name + "拿药 :" + a.getName());
}
}
//抽象元素
abstract class Medicine{
protected String name;
protected double price;
public Medicine(String name,double price){
this.name = name;
this.price = price;
}
public String getName(){
return name;
}
public double getPrice(){
return price;
}
public abstract void accept(Visitor voisitor);
}
//具体元素
class MedicineA extends Medicine{
public MedicineA(String name,double price){
super(name, price);
}
public void accept(Visitor visitor){
visitor.visitor(this);
}
}
class MedicineB extends Medicine{
public MedicineB(String name,double price){
super(name, price);
}
public void accept(Visitor visitor){
visitor.visitor(this);
}
}
//药单
class Presciption{
List<Medicine> list = new ArrayList<Medicine>();
public void accept(Visitor visitor){
java.util.Iterator<Medicine> it = list.iterator();
while(it.hasNext()){
it.next().accept(visitor);
}
}
public void addMedicine(Medicine medicine){
list.add(medicine);
}
public void removeMedicine(Medicine medicine){
list.remove(medicine);
}
}
public class Visit {
public static void main(String[] args) {
Medicine a = new MedicineA("板蓝根", 11.0);
Medicine b = new MedicineA("感康", 14.3);
Presciption presciption = new Presciption();
presciption.addMedicine(a);
presciption.addMedicine(b);
Visitor charger = new Charger();
charger.setName("张三");
Visitor worker = new Worker();
worker.setName("李四");
presciption.accept(charger);
System.out.println("-------------------------------------");
presciption.accept(worker);
}
}