偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

設(shè)計(jì)模式:訪問(wèn)者模式解耦數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作

開(kāi)發(fā) 前端
訪問(wèn)者模式的擴(kuò)展性很強(qiáng),假如我們現(xiàn)在想添加觀眾的類(lèi)別(Element),只需編寫(xiě)類(lèi)繼承 Person 抽象類(lèi)即可,其他地方的代碼無(wú)需改變,如果我們想添加投票的類(lèi)別(Visitor),只需編寫(xiě)類(lèi)實(shí)現(xiàn) Action 接口即可。

一、定義

訪問(wèn)者模式(Visitor Pattern) :封裝一些作用于某種數(shù)據(jù)結(jié)構(gòu)的各元素的操作,它可以在不改變數(shù)據(jù)結(jié)構(gòu)的前提下定義作用于這些元素的新的操作

訪問(wèn)者模式主要將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離,解決數(shù)據(jù)結(jié)構(gòu)和操作耦合性問(wèn)題

訪問(wèn)者模式的基本工作原理是:在被訪問(wèn)的類(lèi)里面加一個(gè)對(duì)外提供接待訪問(wèn)者的接口

訪問(wèn)者模式主要應(yīng)用場(chǎng)景是: 需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同操作(這些操作彼此沒(méi)有關(guān)聯(lián)),同時(shí)需要避免讓這些操作污染這些對(duì)象的類(lèi),可以選用訪問(wèn)者模式解決

二、原始類(lèi)圖

  • Visitor 是抽象訪問(wèn)者,定義訪問(wèn)者的行為規(guī)范
  • ConcreteVisitor :是一個(gè)具體的訪問(wèn)者,繼承(或?qū)崿F(xiàn)) Visitor,實(shí)現(xiàn) Visitor 中定義的每個(gè)方法,實(shí)現(xiàn)具體的行為邏輯
  • Element 定義一個(gè)accept 方法,用于接收一個(gè)訪問(wèn)者對(duì)象(Visitor 的具體實(shí)現(xiàn)類(lèi))
  • ConcreteElement 為具體元素, 實(shí)現(xiàn)了 Element 接口中 accept 方法
  • ObjectStructure 能枚舉它里面所包含的元素(Element), 可以提供一個(gè)高層的接口,目的是允許訪問(wèn)者訪問(wèn)指定的元素

三、案例

1、需求

將人分為男人和女人,對(duì)歌手進(jìn)行測(cè)評(píng),當(dāng)看完某個(gè)歌手表演后,得到他們對(duì)該歌手不同的評(píng)價(jià)(評(píng)價(jià)有不同的種類(lèi),比如成功、失敗、待定等),請(qǐng)使用訪問(wèn)者模式來(lái)說(shuō)實(shí)現(xiàn)。

2、代碼實(shí)現(xiàn)

//定義 Visitor 的行為規(guī)范,getResult() 方法接收 Person 類(lèi)型的參數(shù),用于獲取觀眾對(duì)歌手的評(píng)價(jià)
public abstract class Action {

// 得到觀眾的評(píng)價(jià)
public abstract void getResult(Person person);

}

public class Success extends Action {

@Override
public void getResult(Person person) {
System.out.println(person.gender + "給的評(píng)價(jià)該歌手很成功 !");
}

}

public class Fail extends Action {

@Override
public void getResult(Person person) {
System.out.println(person.gender + "給的評(píng)價(jià)該歌手失敗 !");
}

}

public class Wait extends Action {

@Override
public void getResult(Person person) {
System.out.println(person.gender + "給的評(píng)價(jià)是該歌手待定 ..");
}

}

public abstract class Person {

String gender;

// 提供一個(gè)方法,讓訪問(wèn)者可以訪問(wèn)
public abstract void accept(Action action);

}

//說(shuō)明
//雙分派是指不管類(lèi)怎么變化,我們都能找到期望的方法運(yùn)行。
//雙分派意味著得到執(zhí)行的操作取決于請(qǐng)求的種類(lèi)和兩個(gè)接收者的類(lèi)型
//假設(shè)我們要添加一個(gè)新的狀態(tài)類(lèi),由于使用了雙分派,只需增加一個(gè)Action子類(lèi)即可在客戶(hù)端調(diào)用即可,不
//需要改動(dòng)任何其他類(lèi)的代碼

//1. 這里我們使用到了雙分派, 即首先在客戶(hù)端程序中,將具體狀態(tài)作為參數(shù)傳遞Man中,
//完成第一次的分派
//2. 然后Man 類(lèi)調(diào)用作為參數(shù)的 "具體方法" 中方法getResult, 同時(shí)將自己(this)作為參數(shù)傳入,
//完成第二次的分派
public class Man extends Person {

public Man() {
gender = "男性";
}

@Override
public void accept(Action action) {
action.getResult(this);
}

}

//說(shuō)明
//1. 這里我們使用到了雙分派, 即首先在客戶(hù)端程序中,將具體狀態(tài)作為參數(shù)傳遞Woman中(第一次分派)
//2. 然后Woman 類(lèi)調(diào)用作為參數(shù)的 "具體方法" 中方法getResult, 同時(shí)將自己(this)作為參數(shù)傳入,完成第二次的分派
public class Woman extends Person{

public Woman() {
gender = "女性";
}

@Override
public void accept(Action action) {
action.getResult(this);
}

}

//數(shù)據(jù)結(jié)構(gòu),管理很多人(Man , Woman)
public class ObjectStructure {

// 維護(hù)了一個(gè)集合
private List<Person> persons = new LinkedList<>();

// 增加到list
public void attach(Person p) {
persons.add(p);
}

// 移除
public void detach(Person p) {
persons.remove(p);
}

// 顯示測(cè)評(píng)情況
public void display(Action action) {
for (Person p : persons) {
p.accept(action);
}
}
}

public class Client {

public static void main(String[] args) {
// 創(chuàng)建ObjectStructure
ObjectStructure objectStructure = new ObjectStructure();

objectStructure.attach(new Man());
objectStructure.attach(new Woman());

// 成功
Success success = new Success();
objectStructure.display(success);

// 失敗
System.out.println("===============");
Fail fail = new Fail();
objectStructure.display(fail);

// 待定
System.out.println("=======給的是待定的測(cè)評(píng)========");
Wait wait = new Wait();
objectStructure.display(wait);
}

}

訪問(wèn)者模式的擴(kuò)展性很強(qiáng),假如我們現(xiàn)在想添加觀眾的類(lèi)別(Element),只需編寫(xiě)類(lèi)繼承 Person 抽象類(lèi)即可,其他地方的代碼無(wú)需改變,如果我們想添加投票的類(lèi)別(Visitor),只需編寫(xiě)類(lèi)實(shí)現(xiàn) Action 接口即可。

三、訪問(wèn)者模式優(yōu)缺點(diǎn)

1、優(yōu)點(diǎn)

(1) 訪問(wèn)者模式符合單一職責(zé)原則、讓程序具有優(yōu)秀的擴(kuò)展性、靈活性非常高.

(2)訪問(wèn)者模式可以對(duì)功能進(jìn)行統(tǒng)一,可以做報(bào)表、UI、攔截器與過(guò)濾器,適用于數(shù)據(jù)結(jié)構(gòu)相對(duì)穩(wěn)定的系統(tǒng)

2、缺點(diǎn)

(1)具體元素對(duì)訪問(wèn)者公布細(xì)節(jié),也就是說(shuō)訪問(wèn)者關(guān)注了其他類(lèi)的內(nèi)部細(xì)節(jié),這是迪米特法則所不建議的, 這樣造成了具體元素變更比較困難

(2)違背了依賴(lài)倒轉(zhuǎn)原則。訪問(wèn)者依賴(lài)的是具體元素,而不是抽象元素

(3)因此,如果一個(gè)系統(tǒng)有比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),又有經(jīng)常變化的功能需求,那么訪問(wèn)者模式就是比較合適的

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2023-10-27 10:17:46

設(shè)計(jì)模式訪問(wèn)者元素

2020-10-16 18:41:43

command設(shè)計(jì)模式代碼

2020-11-10 09:20:40

開(kāi)發(fā)模式代碼

2023-03-03 08:12:07

設(shè)計(jì)模式語(yǔ)言

2023-04-10 09:20:13

設(shè)計(jì)模式訪客模式

2022-03-04 09:28:29

代碼訪問(wèn)者模式軟件開(kāi)發(fā)

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2021-02-18 09:06:39

數(shù)據(jù)訪問(wèn)者模式

2021-01-07 10:30:23

設(shè)計(jì)模式

2020-11-05 09:38:07

中介者模式

2021-10-26 00:21:19

設(shè)計(jì)模式建造者

2020-10-20 13:33:00

建造者模式

2023-09-15 10:33:41

算法數(shù)據(jù)結(jié)構(gòu)

2009-11-09 16:14:49

WCF服務(wù)元數(shù)據(jù)

2020-12-01 07:16:05

重學(xué)設(shè)計(jì)模式

2020-10-26 08:45:39

觀察者模式

2021-01-21 05:34:14

設(shè)計(jì)模式建造者

2014-02-17 10:28:34

大數(shù)據(jù)

2023-11-07 12:00:05

分布式系統(tǒng)數(shù)據(jù)訪問(wèn)

2021-06-08 06:01:00

C++數(shù)據(jù)結(jié)構(gòu)向量和數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)