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

时间:2022-07-24
本文章向大家介绍【设计模式-访问者模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

}

运行结果:

类图: