定义:表示一个作用于某对象结构中的各元素操作,他使你可以在不改变各元素的类的前提下定义作用于这些元素的操作。
(这个模式我理解的可能还不是很到位)
举个例子:有一家饭店如果老板来了就给他看账单,如果消防来了他会检查店里的安全状态,如果顾客来了会想看下菜单
在不改变饭店类的前提下实现根据访问者的不同查看的内容也相应不同这就用到访问者模式
一 实现一个可以被访问的目标类他提供一个方法接受访问者,在这个方法中把自己传给访问者让访问者按需取用信息
(也可先提供一个带有接受访问者的方法的接口然后具体实现这里就不抽象了)
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);
}
}
输出:
暂且先这么理解以后体会深了再说
参考资料 研磨设计模式