访问者模式(Visitor)

本文通过一个具体的饭店场景案例,详细介绍了访问者模式的概念及其在Java中的实现方式。该模式允许在不修改对象结构的情况下为一组相关对象添加新的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:表示一个作用于某对象结构中的各元素操作,他使你可以在不改变各元素的类的前提下定义作用于这些元素的操作。

(这个模式我理解的可能还不是很到位)

举个例子:有一家饭店如果老板来了就给他看账单,如果消防来了他会检查店里的安全状态,如果顾客来了会想看下菜单

在不改变饭店类的前提下实现根据访问者的不同查看的内容也相应不同这就用到访问者模式

    一  实现一个可以被访问的目标类他提供一个方法接受访问者,在这个方法中把自己传给访问者让访问者按需取用信息

(也可先提供一个带有接受访问者的方法的接口然后具体实现这里就不抽象了)

public class Hotel {
	//表示店里的账单
	int[] bills = new int[] {100,200,300,400};
	//店里的菜单
	String[] dishes = new String[] {"面","饭","大虾","鱼"};
	//店里的安全状态
	String state="安全";
	
	//接受一个访问者
	public void accept(Visitor visitor)
	{
		visitor.visite(this);
	}
}	

  二 定义 一个访问者接口提供一个方法处理访问目标

public interface Visitor {
	public void visite(Hotel hotel);
}  

三  具体实现访问者 (三个不同的访问者Boss,FireMan,Customer)

老板查看账单收入

public class Boss implements Visitor {

	@Override
	public void visite(Hotel hotel) {
		int sum=0;
		for(int  bill:hotel.bills)
		{
			sum+=bill;
		}
		System.out.println("我是老板我看下今天挣了所少钱,今天挣了"+sum+"元");
	}

}

顾客查看菜单

public class Customer implements Visitor {

	@Override
	public void visite(Hotel hotel) {
		System.out.println("我是顾客我想看看店里有啥菜");
		for(String str:hotel.dishes)
		{
			System.out.println("店里有:"+str);
		}

	}

}

消防员查看店里是否安全

public class FireMan implements Visitor {

	@Override
	public void visite(Hotel hotel) {
		
			System.out.println("我是消防员我看下店里的安全状态是  "+hotel.state);
	}

}

编写测试类

public class Test {

	public static void main(String[] args) {
		//从前有家店
		Hotel hotel = new Hotel();
		System.out.println("=======老板来店里了=======");
		Boss boss = new Boss();	
		hotel.accept(boss);
		System.out.println("=======消防员来安全检查了=======");
		FireMan fm = new FireMan();
		hotel.accept(fm);
		System.out.println("=======顾客想看一下菜单=======");
		Customer cu = new Customer();
		hotel.accept(cu);
		
	}

}

输出:

暂且先这么理解以后体会深了再说

参考资料 研磨设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值