訪問者模式

在不改變集合元素的前提下猾封,為一個集合中的每個元素提供多種訪問方式基茵,即每個元素有多個訪問者對象訪問莽鸿。

角色:

  • Visitor:抽象的訪問者
  • ConcreteVistor:具體訪問者
  • ObjectStructure:提供一個高層接口椎例,允許訪問者訪問元素
  • Element:定義了accept方法劳翰,接收訪問者對象
  • ConcreteElement:具體元素,實現(xiàn)accept方法
package com.strife.pattern.visitor;

import java.time.Period;
import java.util.LinkedList;
import java.util.List;

/**
 * 訪問者模式
 * 測評
 * @author mengzhenghao
 * @date 2022/6/2
 */
public class Visitor {

    public static void main(String[] args) {
        //成功測評
        ObjectStructure successStructure = new ObjectStructure();
        successStructure.attach(new Man());
        successStructure.attach(new Man());
        successStructure.attach(new Man());
        successStructure.attach(new Woman());

        AbstractAction success = new Success();
        successStructure.display(success);

        //失敗測評
        ObjectStructure failStructure = new ObjectStructure();
        AbstractAction fail = new Fail();
        failStructure.attach(new Man());
        failStructure.attach(new Woman());
        failStructure.display(fail);
    }
}

/** 抽象訪問者:Visitor */
abstract class AbstractAction {

    /** 得到男性的測評結(jié)果 */
    public abstract void getManResult(Man man);

    /** 得到女性的測評結(jié)果 */
    public abstract void getWomanResult(Woman woman);

}

/** 具體訪問者:ConcreteVistor */
class Success extends AbstractAction {

    @Override
    public void getManResult(Man man) {
        System.out.println("man success");
    }

    @Override
    public void getWomanResult(Woman woman) {
        System.out.println("woman success");
    }
}

/** 具體訪問者:ConcreteVistor */
class Fail extends AbstractAction {

    @Override
    public void getManResult(Man man) {
        System.out.println("man fail");
    }

    @Override
    public void getWomanResult(Woman woman) {
        System.out.println("woman fail");
    }
}

/** 抽象元素:Element */
abstract class AbstractPerson {

    /** 定義accept方法 */
    public abstract void accept(AbstractAction visitor);
}

/**
 * 具體元素:ConcreteElement
 * 雙分派
 * 首先在客戶端將具體狀態(tài)作為參數(shù)傳入Man(第一次分派)
 * 然后Man類調(diào)用作為參數(shù)的 “具體方法” 中方法 getManResult 尾组,同時將自己(this)作為參數(shù)傳入(第二次分派)
 */
class Man extends AbstractPerson {

    @Override
    public void accept(AbstractAction visitor) {
        visitor.getManResult(this);
    }
}

/** 具體元素:ConcreteElement */
class Woman extends AbstractPerson {

    @Override
    public void accept(AbstractAction visitor) {
        visitor.getWomanResult(this);
    }
}

/** 數(shù)據(jù)結(jié)構(gòu)(ObjectStructure):管理很多AbstractPerson */
class ObjectStructure {
    private List<AbstractPerson> people = new LinkedList<>();

    public void attach(AbstractPerson person) {
        people.add(person);
    }

    public void detach(AbstractPerson person) {
        people.remove(person);
    }

    /** 顯示測評情況 */
    public void display(AbstractAction action) {
        for (AbstractPerson person : people) {
            person.accept(action);
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忙芒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讳侨,更是在濱河造成了極大的恐慌,老刑警劉巖奏属,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跨跨,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勇婴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門忱嘹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耕渴,你說我怎么就攤上這事拘悦。” “怎么了橱脸?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵础米,是天一觀的道長。 經(jīng)常有香客問我添诉,道長屁桑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任栏赴,我火速辦了婚禮蘑斧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘须眷。我一直安慰自己竖瘾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布花颗。 她就那樣靜靜地躺著捕传,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捎稚。 梳的紋絲不亂的頭發(fā)上乐横,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音今野,去河邊找鬼葡公。 笑死,一個胖子當(dāng)著我的面吹牛条霜,可吹牛的內(nèi)容都是我干的催什。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宰睡,長吁一口氣:“原來是場噩夢啊……” “哼蒲凶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拆内,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旋圆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后麸恍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灵巧,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡搀矫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刻肄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓤球。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敏弃,靈堂內(nèi)的尸體忽然破棺而出卦羡,到底是詐尸還是另有隱情,我是刑警寧澤麦到,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布绿饵,位于F島的核電站,受9級特大地震影響隅要,放射性物質(zhì)發(fā)生泄漏蝴罪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一步清、第九天 我趴在偏房一處隱蔽的房頂上張望要门。 院中可真熱鬧,春花似錦廓啊、人聲如沸欢搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炒瘟。三九已至,卻和暖如春第步,著一層夾襖步出監(jiān)牢的瞬間疮装,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工粘都, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留廓推,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓翩隧,卻偏偏與公主長得像樊展,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堆生,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容