訪問(wèn)不怕刘急,就怕理解訪問(wèn)者模式

1.什么是訪問(wèn)者模式?

比如我有一個(gè)賬單浸踩,賬單有收入叔汁,支出兩個(gè)固定方法。但是訪問(wèn)賬單的人不確定,有可能是一個(gè)或者多個(gè)据块。

2.訪問(wèn)者模式有兩個(gè)特點(diǎn)

  1. 一般被訪問(wèn)的東西所持有的方法是固定的码邻,就像賬單只有收入和支出兩個(gè)功能。而訪問(wèn)者是不固定的瑰钮。

  2. 數(shù)據(jù)操作與數(shù)據(jù)結(jié)構(gòu)相分離:頻繁的更改數(shù)據(jù)冒滩,但不結(jié)構(gòu)不變。比如:雖然每一天賬單的數(shù)據(jù)都會(huì)變化(數(shù)據(jù)變化)浪谴,但是只有兩類數(shù)據(jù),就是支出和收入(結(jié)構(gòu)不變)因苹。

簡(jiǎn)化如下圖:

訪問(wèn)者模式.png

例子:

import java.util.ArrayList;
import java.util.List;

/**
 * 創(chuàng)建一個(gè)賬單接口苟耻,有接收訪問(wèn)者的功能
 * 
 * @author hgx
 *
 */
interface Bill {
    void accept(AccountBookView viewer);
}

/**
 * 消費(fèi)單子
 * 
 * @author hgx
 *
 */
class ConsumerBill implements Bill {

    private String item;
    private double amount;

    public ConsumerBill(String item, double amount) {
        this.item = item;
        this.amount = amount;
    }

    public void accept(AccountBookView viewer) {
        viewer.view(this);
    }

    public String getItem() {
        return item;
    }

    public double getAmount() {
        return amount;
    }

}

/**
 * 收入單子
 * 
 * @author hgx
 *
 */
class IncomeBill implements Bill {

    private String item;
    private double amount;

    public IncomeBill(String item, double amount) {
        this.item = item;
        this.amount = amount;
    }

    public void accept(AccountBookView viewer) {
        viewer.view(this);
    }

    public String getItem() {
        return item;
    }

    public double getAmount() {
        return amount;
    }

}

/**
 * 訪問(wèn)者接口
 * 
 * @author hgx
 *
 */
interface AccountBookView {
    // 查看消費(fèi)的單子
    void view(ConsumerBill consumerBill);

    // 查看收入單子
    void view(IncomeBill incomeBill);
}

// 老板類:訪問(wèn)者是老板,主要查看總支出和總收入
class Boss implements AccountBookView {

    private double totalConsumer;
    private double totalIncome;

    // 查看消費(fèi)的單子
    public void view(ConsumerBill consumerBill) {
        totalConsumer = totalConsumer + consumerBill.getAmount();
    }

    // 查看收入單子
    public void view(IncomeBill incomeBill) {
        totalIncome = totalIncome + incomeBill.getAmount();
    }

    public void getTotalConsumer() {
        System.out.println("老板一共消費(fèi)了" + totalConsumer);
    }

    public void getTotalIncome() {
        System.out.println("老板一共收入了" + totalIncome);
    }
}

/**
 * 會(huì)計(jì)類:訪問(wèn)者是會(huì)計(jì)扶檐,主要記錄每筆單子
 * 
 * @author hgx
 *
 */

class CPA implements AccountBookView {

    int count = 0;

    // 查看消費(fèi)的單子
    public void view(ConsumerBill consumerBill) {
        count++;
        if (consumerBill.getItem().equals("消費(fèi)")) {
            System.out.println("第" + count + "個(gè)單子消費(fèi)了:" + consumerBill.getAmount());
        }
    }
    // 查看收入單子

    public void view(IncomeBill incomeBill) {

        if (incomeBill.getItem().equals("收入")) {
            System.out.println("第" + count + "個(gè)單子收入了:" + incomeBill.getAmount());
        }
    }

}

/**
 * 賬單類:用于添加賬單凶杖,和為每一個(gè)賬單添加訪問(wèn)者
 * 
 * @author hgx
 *
 */
class AccountBook {

    private List<Bill> listBill = new ArrayList<Bill>();

    // 添加單子
    public void add(Bill bill) {
        listBill.add(bill);
    }

    // 為每個(gè)賬單添加訪問(wèn)者
    public void show(AccountBookView viewer) {
        for (Bill b : listBill) {
            b.accept(viewer);
        }
    }
}

/*
 *測(cè)試類
 */
public class Test {

    public static void main(String[] args) {
        // 創(chuàng)建消費(fèi)和收入單子
        Bill consumerBill = new ConsumerBill("消費(fèi)", 3000);
        Bill incomeBill = new IncomeBill("收入", 5000);
        Bill consumerBill2 = new ConsumerBill("消費(fèi)", 4000);
        Bill incomeBill2 = new IncomeBill("收入", 8000);
        // 添加單子
        AccountBook accountBook = new AccountBook();
        accountBook.add(consumerBill);
        accountBook.add(incomeBill);
        accountBook.add(consumerBill2);
        accountBook.add(incomeBill2);
        // 創(chuàng)建訪問(wèn)者
        Boss boss = new Boss();
        CPA cpa = new CPA();

        // 接受訪問(wèn)者
        accountBook.show(boss);
        accountBook.show(cpa);
        // boss查看總收入和總消費(fèi)
        boss.getTotalConsumer();
        boss.getTotalIncome();

    }

}

測(cè)試結(jié)果:

第1個(gè)單子消費(fèi)了:3000.0
第1個(gè)單子收入了:5000.0
第2個(gè)單子消費(fèi)了:4000.0
第2個(gè)單子收入了:8000.0
老板一共消費(fèi)了:7000.0
老板一共收入了:13000.0

本文按照個(gè)人理解,全部通俗化解釋款筑,如有錯(cuò)誤希望指出 智蝠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奈梳,隨后出現(xiàn)的幾起案子杈湾,更是在濱河造成了極大的恐慌,老刑警劉巖攘须,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漆撞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡于宙,警方通過(guò)查閱死者的電腦和手機(jī)浮驳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捞魁,“玉大人至会,你說(shuō)我怎么就攤上這事∑准螅” “怎么了奉件?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)旺上。 經(jīng)常有香客問(wèn)我瓶蚂,道長(zhǎng),這世上最難降的妖魔是什么宣吱? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任窃这,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杭攻。我一直安慰自己祟敛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布兆解。 她就那樣靜靜地躺著馆铁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锅睛。 梳的紋絲不亂的頭發(fā)上埠巨,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音现拒,去河邊找鬼辣垒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛印蔬,可吹牛的內(nèi)容都是我干的勋桶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼侥猬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼例驹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起退唠,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹃锈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后铜邮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仪召,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年松蒜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扔茅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秸苗,死狀恐怖召娜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惊楼,我是刑警寧澤玖瘸,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站檀咙,受9級(jí)特大地震影響雅倒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弧可,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一蔑匣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦裁良、人聲如沸凿将。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牧抵。三九已至,卻和暖如春侨把,著一層夾襖步出監(jiān)牢的瞬間犀变,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工座硕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弛作,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓华匾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親机隙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜘拉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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