訪問者模式(Visitor Pattern)

介紹

訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執行算法。通過這種方式,元素的執行算法可以隨着訪問者改變而改變。這種類型的設計模式屬於行爲型模式。根據模式,元素對象已接受訪問者對象,這樣訪問者對象就可以處理元素對象上的操作。

優點

1、符合單一職責原則。

2、優秀的擴展性。

3、靈活性。

缺點

1、具體元素對訪問者公佈細節,違反了迪米特原則。

2、具體元素變更比較困難。

3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。

使用場景

1、對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作。

2、需要對一個對象結構中的對象進行很多不同的並且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。

使用建議

訪問者可以對功能進行統一,可以做報表、UI、攔截器與過濾器。

具體實現

類圖

代碼

package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public interface ComputerPart {
    public void accept(ComputerPartVisitor computerPartVisitor);
}

 

package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public class Computer implements ComputerPart {

    ComputerPart[] parts;

    public Computer(){
        parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
    }


    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        for (int i = 0; i < parts.length; i++) {
            parts[i].accept(computerPartVisitor);
        }
        computerPartVisitor.visit(this);
    }
}
package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public class Mouse  implements ComputerPart {

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public class Keyboard  implements ComputerPart {

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public class Monitor  implements ComputerPart {

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public interface ComputerPartVisitor {
    public void visit(Computer computer);
    public void visit(Mouse mouse);
    public void visit(Keyboard keyboard);
    public void visit(Monitor monitor);
}
package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

    @Override
    public void visit(Computer computer) {
        System.out.println("Displaying Computer.");
    }

    @Override
    public void visit(Mouse mouse) {
        System.out.println("Displaying Mouse.");
    }

    @Override
    public void visit(Keyboard keyboard) {
        System.out.println("Displaying Keyboard.");
    }

    @Override
    public void visit(Monitor monitor) {
        System.out.println("Displaying Monitor.");
    }

}
package com.knowledge.system.software_design_pattern.visitor_pattern.myself_instance;

public class VisitorPatternDemo {
    public static void main(String[] args) {
        ComputerPart computer = new Computer();
        computer.accept(new ComputerPartDisplayVisitor());
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章