您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——访问者模式

小志的博客 发布时间:2021-01-24 23:20:42 ,浏览量:0

一、访问者模式的定义与类型

1、定义

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

2、类型

  • 行为型
二、访问者模式的适用场景
  • 一个数据结构(如List、Set、Map等)包含很多类型的对象
  • 数据结构与数据操作分离
三、访问者模式的优点
  • 新增新的操作很容易,即增加一个新的访问者
四、访问者模式的缺点
  • 增加新的数据结构困难
  • 具体元素变更比较麻烦
五、访问者模式相关设计模式
  • 访问者模式和迭代器模式
六、访问者模式示例

以访问者访问课程类型为例进行代码演示

1、代码结构如下: 在这里插入图片描述

2、定义一个课程的抽象类

package com.rf.designPatterns.behavioral.visitor;

/**
 * @description: 定义一个课程的抽象类
 * @author: xz
 */
public abstract class Course {

    private String name;//课程名称

    public String getName() {
        return name;
    }

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

    public abstract void accept(Visitor visitor);
}

3、定义一个免费课程类

package com.rf.designPatterns.behavioral.visitor;

/**
 * @description: 定义一个免费课程类
 * @author: xz
 */
public class FreeCourse extends Course{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

4、定义一个实战课程类

package com.rf.designPatterns.behavioral.visitor;

/**
 * @description: 定义一个实战课程类
 * @author: xz
 */
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(Visitor visitor) {
        visitor.visit(this);
    }
}

5、定义访问者接口类

package com.rf.designPatterns.behavioral.visitor;

/**
 * @description: 定义访问者接口类
 * @author: xz
 */
public interface Visitor {
    //访问免费课程方法
    void visit(FreeCourse freeCourse);
    //访问实战课程方法
    void visit(CodingCourse codingCourse);
}

6、定义访问者接口的实现类

package com.rf.designPatterns.behavioral.visitor;

/**
 * @description: 定义访问者实现类
 * @author: xz
 */
public class VisitorImpl implements Visitor{
    //访问免费课程,打印所有免费课程名称
    @Override
    public void visit(FreeCourse freeCourse) {
        System.out.println("免费课程:"+freeCourse.getName());
    }
    //访问实战课程,打印所有实战课程名称和价格
    @Override
    public void visit(CodingCourse codingCourse) {
        System.out.println("实战课程:"+codingCourse.getName()+",价格:"+codingCourse.getPrice());
    }
}

7、访问者模式的测试类

package com.rf.designPatterns.behavioral.visitor;

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

/**
 * @description: 访问者模式的测试类
 * @author: xz
 */
public class Test {
    public static void main(String[] args) {
        List list=new ArrayList();
        //声明一个免费课程
        FreeCourse freeCourse = new FreeCourse();
        freeCourse.setName("springboot课程");
        //声明一个实战课程
        CodingCourse codingCourse = new CodingCourse();
        codingCourse.setName("java设计模式课程");
        codingCourse.setPrice(99);

        list.add(freeCourse);
        list.add(codingCourse);

        for(Course c:list){
            c.accept(new VisitorImpl());
        }

    }
}

8、运行测试类输出结果如下: 在这里插入图片描述 9、UML类图如下: 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0451s