設(shè)計(jì)模式-行為型-訪問(wèn)者模式

1、定義

訪問(wèn)者模式:在不改變數(shù)據(jù)結(jié)構(gòu)的前提下,增加作用于一組元素對(duì)象新功能

寫(xiě)法

/**
 * 受訪者
 */
public interface IAccept {
    void accept(IVisitor visit);
    void showInfo();
}

/**
 * 訪問(wèn)者
 */
public interface IVisitor<ACCEPT extends IAccept> {

    void visit(ACCEPT accept);

    Kind kind(); //訪問(wèn)者類型

}

/**
 * 訪問(wèn)者類型
 */
public enum Kind {
    CEO,
    CTO,
    HR
}

/**
 * 訪問(wèn)者模板
 */
public abstract class Visitor implements IVisitor{
    @Override
    public void visit(IAccept accept) {
        accept.showInfo();
    }
}

public class CEOVisitor extends Visitor{

    @Override
    public Kind kind() {
        return Kind.CEO;
    }

}

public class CTOVisitor extends Visitor  {

    @Override
    public Kind kind() {
        return Kind.CTO;
    }

}

/**
 * 訪問(wèn)者
 */
public class HRVisitor extends Visitor{

    @Override
    public Kind kind() {
        return Kind.HR;
    }
}

/**
 * 受訪者--工程師
 */
public class Engineer implements IAccept {

    private String name;
    private String kpi;
    private String line;
    private IVisitor visitor;

    public Engineer(String name, String kpi, String line) {
        this.name = name;
        this.kpi = kpi;
        this.line = line;
    }

    @Override
    public void accept(IVisitor visit) {
        visitor = visit;
        visit.visit( this );
    }

    @Override
    public void showInfo() {
        if (visitor.kind() == Kind.CEO){
            System.out.println( "Engineer{" +
                    "name='" + name + '\'' +
                    ", kpi='" + kpi + '\'' +
                    '}' );
        }else if(visitor.kind() == Kind.CTO){
            System.out.println( "Engineer{" +
                    "name='" + name + '\'' +
                    ", line='" + line + '\'' +
                    '}' );
        }else if(visitor.kind() == Kind.HR){
            System.out.println( "Engineer{" +
                    "name='" + name + '\'' +
                    '}' );
        }
    }

}

/**
 * 受訪者--經(jīng)理
 *
 */
public class Manage implements IAccept{

    private String name;
    private String kpi;
    private String product;
    private IVisitor visitor;

    public Manage(String name, String kpi, String product) {
        this.name = name;
        this.kpi = kpi;
        this.product = product;
    }

    @Override
    public void accept(IVisitor visit) {
        visitor = visit;
        visit.visit( this );
    }

    @Override
    public void showInfo() {
        if (visitor.kind() == Kind.CEO){
            System.out.println( "Manage{" +
                    "name='" + name + '\'' +
                    ", kpi='" + kpi + '\'' +
                    ", product='" + product + '\'' +
                    '}' );
        }else if(visitor.kind() == Kind.CTO){
            System.out.println( "Manage{" +
                    "name='" + name + '\'' +
                    ", product='" + product + '\'' +
                    '}' );
        }else if(visitor.kind() == Kind.HR){
            System.out.println( "Manage{" +
                    "name='" + name + '\'' +
                    '}' );
        }

    }

}

public class Company {

    private List<IAccept> acceptList = new ArrayList<>(  );

    public Company(){
        acceptList.add( new Engineer( "小明","14","1000" ) );
        acceptList.add( new Engineer( "小張","10","12300" ) );
        acceptList.add( new Engineer( "小李","19","100450" ) );
        acceptList.add( new Engineer( "小孫","16","101100" ) );

        acceptList.add( new Manage( "張總","20","花錢項(xiàng)目" ) );
        acceptList.add( new Manage( "馬云","10","五福項(xiàng)目" ) );
        acceptList.add( new Manage( "王總","20","賣大米項(xiàng)目" ) );
        acceptList.add( new Manage( "陳總","20","到天亮項(xiàng)目" ) );
    }

    public void showReport(IVisitor visitor){
        for (IAccept  accept :acceptList){
            accept.accept( visitor );
        }
    }

}

/**
 * 訪問(wèn)者模式
 *
 */
public  class TestMain {

    public static void main(String[] args){

        //公司
        Company company = new Company();

        //訪問(wèn)者查看對(duì)應(yīng)報(bào)告
        company.showReport( new CEOVisitor() );
        company.showReport( new HRVisitor() );
        company.showReport( new CTOVisitor() );
    }

}

代碼示例

https://github.com/yinlingchaoliu/23-design-pattern

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【學(xué)習(xí)難度:★★☆☆☆,使用頻率:★★★☆☆】直接出處:訪問(wèn)者模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 1,027評(píng)論 2 2
  • 產(chǎn)品:筆記本 1、手寫(xiě)生活零碎 只為回憶沉醉 2、一句再一句 一頁(yè)另一頁(yè) 一本又一本 3、筆上生花,紙上世...
    黃小翌閱讀 257評(píng)論 0 0
  • 最近熱播得楚喬傳,一出場(chǎng)陽(yáng)光帥氣,笑起來(lái)露出一口大白牙,眼睛像天上星星般亮晶晶的燕北世子燕洵,相信很多人都被圈粉了...
    js晴萱閱讀 398評(píng)論 0 3
  • 小時(shí)候 感覺(jué)世界很大時(shí)間很慢 長(zhǎng)大了 才發(fā)現(xiàn)它很小時(shí)間也很快
    回亦閱讀 108評(píng)論 0 1

友情鏈接更多精彩內(nèi)容