測評系統(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)原則。訪問者依賴的是具體元素,而不是抽象元素