封裝做用於某數據結構(如List/Set/Map等)中的各元素的操做
能夠在不改變各元素的類的前提下,定義做用於這些元素的操做
類型:行爲型spring
一個數據結構如(List/Set/Map等)包含不少類型對象
數據結構與數據操做分離設計模式
增長新的操做很容易,即增長一個新的訪問者數據結構
具體元素變動比較麻煩ide
訪問者模式和迭代器模式
共同點:都是在某種數據結構上進行處理,例如List、Map、Set
訪問者模式主要用於 對保存在數據結構中的元素進行某種特定的處理
迭代器模式主要用於 逐個遍歷保存在數據結構中的元素測試
模擬場景:針對免費課程和實戰課程,訪問者作出不一樣的行爲this
課程抽象類:設計
public abstract class Course { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public abstract void accept(IVisitor visitor); }
課程實現類1(免費課程):code
public class FreeCourse extends Course { @Override public void accept(IVisitor visitor) { visitor.visit(this); } }
課程實現類2(實戰課程):對象
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); } }
訪問者接口:blog
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()); } @Override public void visit(CodingCourse codingCourse) { System.out.println("實戰課程 : " + codingCourse.getName() + ",價格 : " + codingCourse.getPrice()) ; } }
測試類:
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("訪問者模式講解"); codingCourse.setPrice(99); courseList.add(freeCourse); courseList.add(codingCourse); for (Course course : courseList) { course.accept(new Visitor()); } } }
輸出:
免費課程 : SpringMVC
實戰課程 : 訪問者模式講解,價格 : 99