访问者模式

This commit is contained in:
2020-07-22 14:49:13 +08:00
parent 3beb846604
commit 52b24d0111
6 changed files with 137 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
package top.fjy8018.designpattern.pattern.behavior.visitor;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 实战课,包含价格
*
* @author F嘉阳
* @date 2020/7/22 10:20
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class CodingCourse extends Course {
private int price;
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}

View File

@@ -0,0 +1,15 @@
package top.fjy8018.designpattern.pattern.behavior.visitor;
import lombok.Data;
/**
* @author F嘉阳
* @date 2020/7/22 10:20
*/
@Data
public abstract class Course {
private String name;
public abstract void accept(IVisitor visitor);
}

View File

@@ -0,0 +1,20 @@
package top.fjy8018.designpattern.pattern.behavior.visitor;
/**
* 免费课
*
* @author F嘉阳
* @date 2020/7/22 10:20
*/
public class FreeCourse extends Course {
/**
* 接受策略
*
* @param visitor
*/
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}

View File

@@ -0,0 +1,14 @@
package top.fjy8018.designpattern.pattern.behavior.visitor;
/**
* 封装操作数据结构的方法
*
* @author F嘉阳
* @date 2020/7/22 10:20
*/
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}

View File

@@ -0,0 +1,35 @@
package top.fjy8018.designpattern.pattern.behavior.visitor;
/**
* 访问者
* 核心:对不同类型产生不同的操作行为
* <p>
* jdk源码 {@link java.nio.file.FileVisitor} 实现对文件的访问
* spring源码 {@link org.springframework.beans.factory.config.BeanDefinitionVisitor} 遍历Bean具体属性并填充
*
* @author F嘉阳
* @date 2020/7/22 10:20
*/
public class Visitor implements IVisitor {
/**
* 访问免费课程,打印所有免费课程名称
*
* @param freeCourse
*/
@Override
public void visit(FreeCourse freeCourse) {
System.out.println("免费课程:" + freeCourse.getName());
}
/**
* 访问实战课程,打印所有实战课程名称及价格
*
* @param codingCourse
*/
@Override
public void visit(CodingCourse codingCourse) {
System.out.println("实战课程:" + codingCourse.getName() + " 价格:" + codingCourse.getPrice() + "");
}
}

View File

@@ -0,0 +1,32 @@
package top.fjy8018.designpattern.pattern.behavior.visitor;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
/**
* @author F嘉阳
* @date 2020/7/22 16:19
*/
class VisitorTest {
@Test
void visit() {
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());
}
}
}