學(xué)習(xí)筆記:設(shè)計模式之訪問者模式

測評系統(tǒng)需求:
將觀眾分為男人和女人,對歌手進(jìn)行測評,當(dāng)看完某個歌手表演后,得到他們對該歌手不同的評價(評價 有不同的種類,比如成功、失敗等)

訪問者模式

訪問者模式(Visitor Pattern ),封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)的各元素的操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作。主要將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離,解決數(shù)據(jù)結(jié)構(gòu)和操作耦合性問題。訪問者模 式的基本工作原理是:在被訪問的類里面加一個對外提供接待訪問者的接口。訪問者模式主要應(yīng)用場景是:需要對一個對象結(jié)構(gòu)中的對象進(jìn)行很多不同操作(這些操作彼此沒有關(guān)聯(lián)),同時需要避免讓這些操作"污染"這些對象的類,可以選用訪問者模式解決。

代碼實現(xiàn)
public abstract class Result {
    public abstract void manResult(Man man);
    public abstract void womanResult(Woman woman);
}
public class Success extends Result{
    @Override
    public void manResult(Man man) {
        System.out.println("男人認(rèn)為歌手成功!");
    }
    @Override
    public void womanResult(Woman woman) {
        System.out.println("女人認(rèn)為歌手成功!");
    }
}
public class Failed extends Result{
    @Override
    public void manResult(Man man) {
        System.out.println("男人認(rèn)為歌手失??!");
    }
    @Override
    public void womanResult(Woman woman) {
        System.out.println("女人認(rèn)為歌手失敗!");
    }
}
public abstract class Person {
    public abstract void getResult(Result result);
}
public class Man extends Person{
    @Override
    public void getResult(Result result) {
        result.manResult(this);
    }
}
public class Woman extends Person{
    @Override
    public void getResult(Result result) {
        result.womanResult(this);
    }
}
public class Manager {
    List<Person> persons = new ArrayList<>();
    public void add(Person p) {
        persons.add(p);
    }
    public void remove(Person p) {
        persons.remove(p);
    }
    public void display(Result result) {
        for(Person p: persons) {
            p.getResult(result);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Manager manager = new Manager();
        manager.add(new Man());
        manager.add(new Woman());
        manager.display(new Success());
        manager.display(new Failed());
    }
}
訪問者模式的注意事項和細(xì)節(jié)

優(yōu)點(diǎn)
① 訪問者模式符合單一職責(zé)原則、讓程序具有優(yōu)秀的擴(kuò)展性、靈活性非常高
② 訪問者模式可以對功能進(jìn)行統(tǒng)一,可以做報表、UI、攔截器與過濾器,適用于數(shù)據(jù)結(jié)構(gòu)相對穩(wěn)定且經(jīng)常變化的功能需求的系統(tǒng)
缺點(diǎn)
① 具體元素對訪問者公布細(xì)節(jié),也就是說訪問者關(guān)注了其他類的內(nèi)部細(xì)節(jié),這是迪米
特法則所不建議的, 這樣造成了具體元素變更比較困難
② 違背了依賴倒轉(zhuǎn)原則。訪問者依賴的是具體元素,而不是抽象元素

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

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