【导读】日常刷剧时,一个视频网站会对不同的用户开放不同的权限,比如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()); } }
运行结果:
类图:
本文分享自微信公众号 - Liusy01(Liusy_01),作者:Liusy01
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-03-30
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句