【导读】日常刷剧时,一个视频网站会对不同的用户开放不同的权限,比如vip可以看每日更新内容,vvip可以提前解锁内容,普通用户啥也没有。这种模式就是访问者模式。
一、定义
在不改变集合元素的情况下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问,相同的元素对不同的访问者会产生不一样的行为。
二、实例
就比如视频网站不同的用户可以看到不同的内容为例。
抽象用户对象:
public interface Visitor {
1、访问免费网页
void visitFree(FreeWebpage freeWebpage);
2、访问vip网页
void visitVip(VipWebpage vipWebpage);
}
vip用户对象:
public class VipVisitor implements Visitor {
@Override
public void visitFree(FreeWebpage freeWebpage) {
System.out.println("Vip用户访问免费网页:"+ freeWebpage.getPageName());
}
@Override
public void visitVip(VipWebpage vipWebpage) {
System.out.println("Vip用户访问vip网页:"+ vipWebpage.getPageName()+",价格为"+vipWebpage.getPirce()+"元");
}
}
普通用户:
public class GeneralVisitor implements Visitor {
@Override
public void visitFree(FreeWebpage freeWebpage) {
System.out.println("普通用户访问免费网页:"+ freeWebpage.getPageName());
}
@Override
public void visitVip(VipWebpage vipWebpage) {
System.out.println("普通用户无法访问vip网页:"+ vipWebpage.getPageName()+",价格为"+vipWebpage.getPirce()+"元");
}
}
网页接口对象:
public interface Webpage {
void accept(Visitor visitor);
}
VIP网页对象:
public class VipWebpage implements Webpage{
private String pageName;
private int pirce;
public VipWebpage(String pageName, int pirce) {
this.pageName = pageName;
this.pirce = pirce;
}
@Override
public void accept(Visitor visitor) {
visitor.visitVip(this);
}
}
免费网页对象:
public class FreeWebpage implements Webpage{
private String pageName;
public void setPageName(String pageName) {
this.pageName = pageName;
}
@Override
public void accept(Visitor visitor) {
visitor.visitFree(this);
}
}
测试代码:
public static void main(String[] args) {
List<Webpage> webpageList = new ArrayList<Webpage>();
webpageList.add(new FreeWebpage("系统首页"));
webpageList.add(new VipWebpage("vip专享",500));
for (Webpage webpage : webpageList) {
webpage.accept(new GeneralVisitor());
webpage.accept(new VipVisitor());
}
}
运行结果:
类图: