设计模式(二三)-- 访问者模式

源代码
GitHub源代码

1.本文目标

本文目标是为了让大家认识并理解访问者模式

2.基本套路

定义:封装作用于某数据结构(比如List,Set,Map等)中的个元素的操作
类型:行为型
选择关键点:数据结构是否稳定以及操作是否经常变化
设计原则:遵循倾斜的开闭原则
使用概率:5%
难度系数:高

3.适用场景

1.一个数据结构如(List/Set/Map等)包含很多类型对象
2.数据结构与数据操作分类

4.使用步骤

用栗子能更好的说明问题,请继续往下看

5.举个栗子

我们用具体的代码去更好的理解这个设计模式

5.1栗子说明

  • 背景:网站上有免费课程和付费课程
  • 目的:用访问者模式模拟

5.2使用步骤

实现代码如下:

步骤1.创建课程类

public abstract class Course {
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    //是否接受访问
    public abstract void accept(IVisitor visitor);
}

步骤2.创建Visitor 接口

public interface IVisitor {
    //访问免费课程
    void visit(FreeCourse freeCourse);

    //访问付费课程
    void visit(CodingCourse codingCourse);
}

步骤3. 创建免费课程和代码付费课程

public class FreeCourse extends Course {

    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

public class CodingCourse extends Course {
    private int price;

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

步骤4. 创建Visitor的实现类

public class Visitor implements IVisitor {

    //访问免费课程,打印所有免费课程名称
    @Override
    public void visit(FreeCourse freeCourse) {
        System.out.println("免费课程:"+freeCourse.getName());
    }

    //访问付费课程,打印所有实战课程名称及价格
    @Override
    public void visit(CodingCourse codingCourse) {
        System.out.println("付费课程:"+codingCourse.getName()+" 价格:"+codingCourse.getPrice()+"元");
    }
}

步骤5. 测试

 public static void main(String[] args) {
        List courseList = new ArrayList<>();

        //免费课程
        FreeCourse freeCourse = new FreeCourse();
        freeCourse.setName("Android基础");

        //付费课程
        CodingCourse codingCourse = new CodingCourse();
        codingCourse.setName("Java设计模式精讲");
        codingCourse.setPrice(299);

        courseList.add(freeCourse);
        courseList.add(codingCourse);

        for (Course course : courseList) {
            course.accept(new Visitor());
        }
 }

6.优点

  • 增加新的操作很容易,就是增加一个新的访问者

7.缺点

  • 增加新的数据结构困难
  • 具体元素变更比较麻烦

8.总结

本文只是对访问者模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。

你可能感兴趣的:(设计模式(二三)-- 访问者模式)