Java 设计模式--访问者模式

本设计模式资料源于慕课网,讲师:Geely 《Java设计模式精讲 Debug方式+内存分析》,本人作为自己手打整理作为学习的归纳总结。

一,模式介绍

1,定义和类型

  • 定义:封装作用于某数据结构(如List/Set/Map)中的各元素的操作
  • 可以在不改变各元素的类的前提下,定义作用于这些元素的各种操作
  • 类型:行为型

2,适用场景

  • 一个数据结构(如List/Set/Map)包含很多类型对象
  • 数据结构和数据操作分离

3,优点

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

4,缺点

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

5,相关设计模式

  • 访问者模式和迭代器模式

二,代码演示

  • 业务场景
    实现对免费和收费课程的两种访问方式

课程抽象类

package com.try1.design.behavioral.visitor;

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);
}

免费课程继承类

package com.try1.design.behavioral.visitor;

public class FreeCourse extends Course {
    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

收费课程继承类

package com.try1.design.behavioral.visitor;

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);
    }
}

观察者接口类

package com.try1.design.behavioral.visitor;

public interface IVisitor {
    void visit(FreeCourse freeCourse);
    void visit(CodingCourse codingCourse);
}

接口实现类

package com.try1.design.behavioral.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());
    }
}

测试类

package com.try1.design.behavioral.visitor;

import java.util.ArrayList;
import java.util.List;

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

        FreeCourse freeCourse=new FreeCourse();
        freeCourse.setName("SpringMVC数据绑定");

        CodingCourse codingCourse=new CodingCourse();
        codingCourse.setName("Java设计模式精讲");
        codingCourse.setPrice(299);

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

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

运行截图
在这里插入图片描述

三,小结

  • 访问者模式是通过在定义一个访问目标抽象类,在这个抽象类要实现一个访问者的引用,同时再利用访问者类的多态,不同的继承类会有不同的访问方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值