Java23種設計模式之-----訪問者模式

一、什麼是訪問者模式?
Visitor模式也叫做訪問者模式,是行爲模式之一,它分離對象的數據和行爲,使用Visitor模式,可以不修改已有類的情況下,增加新的操作。
二、訪問者模式的應用實例
比如有一個公園,有一到多個不同的組成部分:該公園存在多個訪問者:清潔工A負責打掃公園A部分,清潔工B負責打掃公園的B部分,公園的管理者負責檢點各項事務是否完成,上級領導可以視察公園等等,也就是說,對於同一個公園,不同的訪問者有不同的行爲操作,而且訪問者的種類也可能需要根據時間額推移而變化(行爲的擴展性)。根據軟件的開閉原則(對修改關閉,對擴展開發),我們怎麼樣實現這種需求呢?
三、訪問者模式結構
這裏寫圖片描述
四、訪問者模式的角色和職責
(1)、訪問者角色(Visitor):爲該對象結構種具體元素角色聲明一個訪問操作接口。該操作接口的名字和參數標識了發送訪問請求給具體元素角色。這樣訪問者就可以通過該元素的特定接口直接訪問它。
(2)、具體訪問者角色(Concrete Visitor);實現每一個由訪問者角色(Visitor)聲明的操作。
(3)、元素角色(Element):定義一個Accept操作,它以一個訪問者爲參數。
(4)、具體元素角色(Concrete Element):實現由元素角色提供的Accept操作。
(5)對象結構角色、(Object Structure):這是使用訪問者模式必備的角色。它要具備以下特徵:能枚舉它的元素;可以提供一個高層的接口以允許該訪問者訪問它的元素;可以是一個複合(組合模式)或是一個集合,如一個列表或者一個無序集合。
五、代碼實現
(1)、創建ParkElement接口

package com.renxin.visitor;
/**
 * 公園每一部分的抽象
 * @author Administrator
 *
 */
public interface ParkElement {
    //用來接納訪問者
    public void accept(Visitor visitor);
}

(2)、創建park類,實現接口ParkElement

package com.renxin.visitor;

public class Park implements ParkElement{

    private ParkA parkA;
    private ParkB parkB;


    public Park() {
        this.parkA = new ParkA();
        this.parkB = new ParkB();
    }


    public void accept(Visitor visitor) {
        visitor.visit(this);
        parkA.accept(visitor);
        parkB.accept(visitor);

    }

}

(3)、創建ParkA和ParkB 並實現接口ParkElement

package com.renxin.visitor;
/**
 * 公園A部分
 * @author Administrator
 *
 */
public class ParkA implements ParkElement {

    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

}
package com.renxin.visitor;
/**
 * 公園B部分
 * @author Administrator
 *
 */
public class ParkB implements ParkElement {

    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

}

(4)、創建Visitor接口

package com.renxin.visitor;
/*
 * 訪問者
 */
public interface Visitor {

    public void visit(Park park);
    public void visit(ParkA parkA);
    public void visit(ParkB parkB);
}

(5)、創建VisitorA和VisitorB 並實現接口Visitor

package com.renxin.visitor;
/**
 * 清潔工A,負責parkA 的衛生情況
 * @author Administrator
 *
 */
public class VisitorA implements Visitor {

    public void visit(Park park) {


    }

    public void visit(ParkA parkA) {
        System.out.println("清潔工A:完成公園A的衛生");

    }

    public void visit(ParkB parkB) {


    }

}
package com.renxin.visitor;
/**
 * 清潔工B,負責parkB 的衛生情況
 * @author Administrator
 *
 */
public class VisitorB implements Visitor {

    public void visit(Park park) {


    }

    public void visit(ParkA parkA) {

    }

    public void visit(ParkB parkB) {

        System.out.println("清潔工B:完成公園B的衛生");
    }

}

(6)、創建VisitorManager並實現接口Visitor

package com.renxin.visitor;
/**
 * 管理員
 * @author Administrator
 *
 */
public class VisitorManager implements Visitor {


    public void visit(Park park) {
        System.out.println("管理員:負責公園衛生檢查");

    }

    @Override
    public void visit(ParkA parkA) {
        System.out.println("管理員:負責公園A衛生檢查");

    }

    @Override
    public void visit(ParkB parkB) {
        System.out.println("管理員:負責公園B衛生檢查");

    }

}

(7)、創建測試類MainClass

package com.renxin.visitor;

public class MainClass {
    public static void main(String[] args) {
        Park park = new Park();

        VisitorA visitorA = new VisitorA();
        park.accept(visitorA);

        VisitorB visitorB = new VisitorB();
        park.accept(visitorB);

        VisitorManager visitorManager = new VisitorManager();
        park.accept(visitorManager);
    }
}

控制檯打印結果爲:

清潔工A:完成公園A的衛生
清潔工B:完成公園B的衛生
管理員:負責公園衛生檢查
管理員:負責公園A衛生檢查
管理員:負責公園B衛生檢查
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章