专栏首页Liusy01【设计模式-访问者模式】

【设计模式-访问者模式】

【导读】日常刷剧时,一个视频网站会对不同的用户开放不同的权限,比如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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Netty之MessagePack编解码框架

    一个高效的二进制序列化格式。它让你像JSON一样可以在各种语言之间交换数据。但是它比JSON更快、更小的整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多...

    Liusy
  • 【设计模式-责任链模式】

    【导读】当有问题需要请教时,咨询别人,当其处理不了的时候,就咨询另外一个人,直到有人能处理此问题。这个就是典型的责任链模式。

    Liusy
  • Netty之TCP粘包/拆包

    TCP会根据缓冲区的实际大小情况进行包的拆分和合并,所谓粘包,就是将多个小的包封装成一个大的包进行发送。拆包,即是将一个超过缓冲区可用大小的包拆分成多个包进行发...

    Liusy
  • Java多线程编程—锁优化

    Tencent JCoder
  • Java多线程编程——锁优化

    美的让人心动
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    发布于 2018-07-25 13:20 更新于 2018-07...

    walterlv
  • 学生时代的最后一个新年,请一定要做这五件事

    再过一天就要过年了,虽说如今年味越来越淡了,但是毕竟还是一年一度家人团圆的日子,学生党可以说是新春大军里最轻松自在的一群人了,既不用担心春运买不到票,又不用担心...

    黄小斜
  • 人们如何使用物联网

    在物联网(IoT)的早期阶段,它很大一部分的工作重点都是放在工业应用上的,例如改进机器的自主操作,或者像Fitbit这样的独立消费产品。但是从我们的研究中,我们...

    lixiao
  • java8中,java.util.Date, java.sql.Date, java.time.LocalDate 的转换异常及处理

    java8中,java.util.Date, java.sql.Date, java.time.LocalDate 的转换异常及处理

    用户7886150
  • JAVA中Sql时间格式与util时间格式转换

      pst.setDate(1, ;//这里的Date是sql中的::得到的是日期

    瑾诺学长

扫码关注云+社区

领取腾讯云代金券