設計模式之訪問者模式
訪問者模式涉及的角色如下:
1 抽象訪問者(Visitor)角色:聲明瞭一個或多個方法操作,形成所有具體訪問者角色必須實現的接口。
2 具體訪問者(ConcreteVisitor)角色:實現抽象訪問在所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。
3 抽象節點(Node)角色:聲明一個接受操作,接受一個訪問者對象所爲一個參數
4 具體節點(ConcreteNode)角色:實現了抽象節點所規定的接受操作。
5 結構對象(ObjectStructure)角色:有如下的責任,可以遍歷結構中的所有元素;如果需要,
提供一個高層次接口讓訪問者對象可以訪問每一個元素,可以設計成一個複合對象或一個聚集,List或set
Visitor:抽象層
public interface Visitor {
/**
* 對應於NodeA的訪問操作
*/
public void visit(NodeA node);
/**
* 對應於NodeB的訪問操作
*/
public void visit(NodeB node);
}
具體訪問者:
public class VisitorA implements Visitor {
/**
* 對應於NodeA的訪問操作
*/
@Override
public void visit(NodeA node) {
System.out.println(node.operationA());
}
/**
* 對應於NodeB的訪問操作
*/
@Override
public void visit(NodeB node) {
System.out.println(node.operationB());
}
}
public class VisitorB implements Visitor {
/**
* 對應於NodeA的訪問操作
*/
@Override
public void visit(NodeA node) {
System.out.println(node.operationA());
}
/**
* 對應於NodeB的訪問操作
*/
@Override
public void visit(NodeB node) {
System.out.println(node.operationB());
}
}
抽象節點類:
public abstract class Node {
/**
* 接受操作
*/
public abstract void accept(Visitor visitor);
}
具體節點:
public class NodeA extends Node{
/**
* 接受操作
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeA特有的方法
*/
public String operationA(){
return "NodeA";
}
}
public class NodeB extends Node{
/**
* 接受方法
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeB特有的方法
*/
public String operationB(){
return "NodeB";
}
}
結構對象角色類:這個結構對象角色持有一個聚集,並向外界提供add()方法作爲對聚集的管理操作。通過調用這個方法,可以動態地增加一個新的節點。
public class ObjectStructure {
private List<Node> nodes = new ArrayList<Node>();
/**
* 執行方法操作
*/
public void action(Visitor visitor){
for(Node node : nodes)
{
node.accept(visitor);
}
}
/**
* 添加一個新元素
*/
public void add(Node node){
nodes.add(node);
}
}
客戶端
public class Client {
public static void main(String[] args) {
//創建一個結構對象
ObjectStructure os = new ObjectStructure();
//給結構增加一個節點
os.add(new NodeA());
//給結構增加一個節點
os.add(new NodeB());
//創建一個訪問者
Visitor visitor = new VisitorA();
os.action(visitor);
}
}
1 抽象訪問者(Visitor)角色:聲明瞭一個或多個方法操作,形成所有具體訪問者角色必須實現的接口。
2 具體訪問者(ConcreteVisitor)角色:實現抽象訪問在所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。
3 抽象節點(Node)角色:聲明一個接受操作,接受一個訪問者對象所爲一個參數
4 具體節點(ConcreteNode)角色:實現了抽象節點所規定的接受操作。
5 結構對象(ObjectStructure)角色:有如下的責任,可以遍歷結構中的所有元素;如果需要,
提供一個高層次接口讓訪問者對象可以訪問每一個元素,可以設計成一個複合對象或一個聚集,List或set
Visitor:抽象層
public interface Visitor {
/**
* 對應於NodeA的訪問操作
*/
public void visit(NodeA node);
/**
* 對應於NodeB的訪問操作
*/
public void visit(NodeB node);
}
具體訪問者:
public class VisitorA implements Visitor {
/**
* 對應於NodeA的訪問操作
*/
@Override
public void visit(NodeA node) {
System.out.println(node.operationA());
}
/**
* 對應於NodeB的訪問操作
*/
@Override
public void visit(NodeB node) {
System.out.println(node.operationB());
}
}
public class VisitorB implements Visitor {
/**
* 對應於NodeA的訪問操作
*/
@Override
public void visit(NodeA node) {
System.out.println(node.operationA());
}
/**
* 對應於NodeB的訪問操作
*/
@Override
public void visit(NodeB node) {
System.out.println(node.operationB());
}
}
抽象節點類:
public abstract class Node {
/**
* 接受操作
*/
public abstract void accept(Visitor visitor);
}
具體節點:
public class NodeA extends Node{
/**
* 接受操作
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeA特有的方法
*/
public String operationA(){
return "NodeA";
}
}
public class NodeB extends Node{
/**
* 接受方法
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeB特有的方法
*/
public String operationB(){
return "NodeB";
}
}
結構對象角色類:這個結構對象角色持有一個聚集,並向外界提供add()方法作爲對聚集的管理操作。通過調用這個方法,可以動態地增加一個新的節點。
public class ObjectStructure {
private List<Node> nodes = new ArrayList<Node>();
/**
* 執行方法操作
*/
public void action(Visitor visitor){
for(Node node : nodes)
{
node.accept(visitor);
}
}
/**
* 添加一個新元素
*/
public void add(Node node){
nodes.add(node);
}
}
客戶端
public class Client {
public static void main(String[] args) {
//創建一個結構對象
ObjectStructure os = new ObjectStructure();
//給結構增加一個節點
os.add(new NodeA());
//給結構增加一個節點
os.add(new NodeB());
//創建一個訪問者
Visitor visitor = new VisitorA();
os.action(visitor);
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.