示例類圖
訪問者模式.png
示例代碼
被訪問對象(被操作對象)抽象層
- 定義了抽象方法,將對自身的操作權限交由IVisitor;
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);
}
被訪問對象(被操作對象)具體層
- 將對自己的造作權限交由IVisitor只搁;
public class FreeCourse extends Course {
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
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);
}
}
抽象訪問層
- 在抽象層定義了對不同的具體被訪問對象的訪問邏輯是不一樣的蛋逾;
- 定義了我這個IVisitor掌握了對FreeCourse和CodingCourse的操作權限;
public interface IVisitor {
void visit(FreeCourse freeCourse);
void visit(CodingCourse codingCourse);
}
具體訪問層
- 具體實現了針對不同具體被訪問者的不同訪問邏輯晌砾;
public class Visitor implements IVisitor {
//訪問免費課程凛捏,打印所有免費課程名稱
@Override
public void visit(FreeCourse freeCourse) {
System.out.println("免費課程:" + freeCourse.getName());
}
//訪問實戰(zhàn)課程担忧,打印所有實戰(zhàn)課程名稱及價格
@Override
public void visit(CodingCourse codingCourse) {
System.out.println("實戰(zhàn)課程:" + codingCourse.getName()
+ " 價格:" + codingCourse.getPrice()+"元");
}
}
客戶端
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Course> courseList = new ArrayList<Course>();
FreeCourse freeCourse = new FreeCourse();
freeCourse.setName("SpringMVC數據綁定");
CodingCourse codingCourse = new CodingCourse();
codingCourse.setName("Java設計模式精講 -- By Geely");
codingCourse.setPrice(299);
courseList.add(freeCourse);
courseList.add(codingCourse);
for(Course course : courseList){
course.accept(new Visitor());
}
}
}
輸出:
免費課程:SpringMVC數據綁定
實戰(zhàn)課程:Java設計模式精講 -- By Geely 價格:299元