訪問者模式

1、訪問者模式介紹

一、定義與類型

封裝做用於某數據結構(如List/Set/Map等)中的各元素的操做
能夠在不改變各元素的類的前提下,定義做用於這些元素的操做
類型:行爲型spring

二、適用場景

一個數據結構如(List/Set/Map等)包含不少類型對象
數據結構與數據操做分離設計模式

三、優勢

增長新的操做很容易,即增長一個新的訪問者數據結構

四、缺點

具體元素變動比較麻煩ide

五、相關設計模式

訪問者模式和迭代器模式
共同點:都是在某種數據結構上進行處理,例如List、Map、Set
訪問者模式主要用於 對保存在數據結構中的元素進行某種特定的處理
迭代器模式主要用於 逐個遍歷保存在數據結構中的元素測試

2、代碼示例

模擬場景:針對免費課程和實戰課程,訪問者作出不一樣的行爲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

3、源碼示例

一、Jdk中的FileVisitor

二、Spring中的BeanDefinitionVisitor

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息