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
诸葛