1 代码演练
1.1 代码演练1
1 代码演练
1.1 代码演练1
需求:
木木网发布课程,有 付费课程 和免费课程。要设计出不同的游客访问不同课程看到的权限不同((其实领导不应该在visitor中,这里为了方便讲解)领导可以看到课程绩效,课程名字和课程价格,其他游客可以看到付费课程名字和价格以及免费课程的名字)
重点:(个人开发中没有注意到的地方)
1 核心:根据不同的Visitor对相同的数据产生不同的操作行为。
2 测试类中用的是 course.accept(new Visitor()) 而不是 new Visitor().visior(Course); 之所以这样设计,就是为了防止领导 和 普通游客 访问课程出现冲突。参考核心(红线标注部分)。
uml类图:

测试类:
package com.geely.design.pattern.behavioral.visitor;
import java.util.ArrayList;
import java.util.List;
public class Test {
@org.junit.Test
public void Test(){
CodingCourse course1 = new CodingCourse();
FreeCourse course2 = new FreeCourse();
course1.setCourseName("付费课程名字");
course1.setPrice(88.88);
course1.setJiXiao(9999.00);
course2.setCourseName("免费课程名字");
course2.setJiXiao(1000000.00);
List<Course> courseList = new ArrayList<Course>();
courseList.add(course1);
courseList.add(course2);
for(Course course: courseList){
course.accept(new Visitor());
}
course2.accept(new LeaderVisitor());
}
}
课程抽象类:
package com.geely.design.pattern.behavioral.visitor;
/**
* 课程抽象类
*/
public abstract class Course {
//课程名字 ,被子类所引用
private String courseName;
//课程
private Double jiXiao;
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public Double getJiXiao() {
return jiXiao;
}
public void setJiXiao(Double jiXiao) {
this.jiXiao = jiXiao;
}
//注意,不想实现可以写成抽象方法
public abstract void accept(IVisitor visitor);
}
免费课程类:
package com.geely.design.pattern.behavioral.visitor;
public class FreeCourse extends Course {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
收费课程类:
package com.geely.design.pattern.behavioral.visitor;
public class CodingCourse extends Course {
private Double price;
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
游客接口:
package com.geely.design.pattern.behavioral.visitor;
public interface IVisitor {
void visit(CodingCourse course);
void visit(FreeCourse course);
}
普通游客类:
package com.geely.design.pattern.behavioral.visitor;
public class Visitor implements IVisitor {
@Override
public void visit(CodingCourse course) {
System.out.println("课程名字是"+course.getCourseName()+",课程价格是:"+course.getPrice());
}
@Override
public void visit(FreeCourse course) {
System.out.println("课程名字是"+course.getCourseName());
}
}
领导游客类:
package com.geely.design.pattern.behavioral.visitor;
public class LeaderVisitor implements IVisitor {
@Override
public void visit(CodingCourse course) {
System.out.println("课程名字是"+course.getCourseName()+",课程价格是:"+course.getPrice()+",课程绩效是:"+course.getJiXiao());
}
@Override
public void visit(FreeCourse course) {
System.out.println("课程名字是"+course.getCourseName()+",课程绩效是:"+course.getJiXiao());
}
}
打印日志:
课程名字是付费课程名字,课程价格是:88.88 课程名字是免费课程名字 课程名字是免费课程名字,课程绩效是:1000000.0 Process finished with exit code 0
来源:https://www.cnblogs.com/1446358788-qq/p/12433638.html