访问者设计模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值