成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

設計模式:訪問者模式解耦數據結構和數據操作

開發 前端
訪問者模式的擴展性很強,假如我們現在想添加觀眾的類別(Element),只需編寫類繼承 Person 抽象類即可,其他地方的代碼無需改變,如果我們想添加投票的類別(Visitor),只需編寫類實現 Action 接口即可。

一、定義

訪問者模式(Visitor Pattern) :封裝一些作用于某種數據結構的各元素的操作,它可以在不改變數據結構的前提下定義作用于這些元素的新的操作

訪問者模式主要將數據結構與數據操作分離,解決數據結構和操作耦合性問題

訪問者模式的基本工作原理是:在被訪問的類里面加一個對外提供接待訪問者的接口

訪問者模式主要應用場景是: 需要對一個對象結構中的對象進行很多不同操作(這些操作彼此沒有關聯),同時需要避免讓這些操作污染這些對象的類,可以選用訪問者模式解決

二、原始類圖

  • Visitor 是抽象訪問者,定義訪問者的行為規范
  • ConcreteVisitor :是一個具體的訪問者,繼承(或實現) Visitor,實現 Visitor 中定義的每個方法,實現具體的行為邏輯
  • Element 定義一個accept 方法,用于接收一個訪問者對象(Visitor 的具體實現類)
  • ConcreteElement 為具體元素, 實現了 Element 接口中 accept 方法
  • ObjectStructure 能枚舉它里面所包含的元素(Element), 可以提供一個高層的接口,目的是允許訪問者訪問指定的元素

三、案例

1、需求

將人分為男人和女人,對歌手進行測評,當看完某個歌手表演后,得到他們對該歌手不同的評價(評價有不同的種類,比如成功、失敗、待定等),請使用訪問者模式來說實現。

2、代碼實現

//定義 Visitor 的行為規范,getResult() 方法接收 Person 類型的參數,用于獲取觀眾對歌手的評價
public abstract class Action {

// 得到觀眾的評價
public abstract void getResult(Person person);

}

public class Success extends Action {

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

}

public class Fail extends Action {

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

}

public class Wait extends Action {

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

}

public abstract class Person {

String gender;

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

}

//說明
//雙分派是指不管類怎么變化,我們都能找到期望的方法運行。
//雙分派意味著得到執行的操作取決于請求的種類和兩個接收者的類型
//假設我們要添加一個新的狀態類,由于使用了雙分派,只需增加一個Action子類即可在客戶端調用即可,不
//需要改動任何其他類的代碼

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

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

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

}

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

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

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

}

//數據結構,管理很多人(Man , Woman)
public class ObjectStructure {

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

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

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

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

public class Client {

public static void main(String[] args) {
// 創建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("=======給的是待定的測評========");
Wait wait = new Wait();
objectStructure.display(wait);
}

}

訪問者模式的擴展性很強,假如我們現在想添加觀眾的類別(Element),只需編寫類繼承 Person 抽象類即可,其他地方的代碼無需改變,如果我們想添加投票的類別(Visitor),只需編寫類實現 Action 接口即可。

三、訪問者模式優缺點

1、優點

(1) 訪問者模式符合單一職責原則、讓程序具有優秀的擴展性、靈活性非常高.

(2)訪問者模式可以對功能進行統一,可以做報表、UI、攔截器與過濾器,適用于數據結構相對穩定的系統

2、缺點

(1)具體元素對訪問者公布細節,也就是說訪問者關注了其他類的內部細節,這是迪米特法則所不建議的, 這樣造成了具體元素變更比較困難

(2)違背了依賴倒轉原則。訪問者依賴的是具體元素,而不是抽象元素

(3)因此,如果一個系統有比較穩定的數據結構,又有經常變化的功能需求,那么訪問者模式就是比較合適的

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-10-27 10:17:46

設計模式訪問者元素

2020-10-16 18:41:43

command設計模式代碼

2020-11-10 09:20:40

開發模式代碼

2023-03-03 08:12:07

設計模式語言

2023-04-10 09:20:13

設計模式訪客模式

2022-03-04 09:28:29

代碼訪問者模式軟件開發

2022-07-13 08:36:57

MQ架構設計模式

2021-02-18 09:06:39

數據訪問者模式

2021-01-07 10:30:23

設計模式

2020-10-20 13:33:00

建造者模式

2021-10-26 00:21:19

設計模式建造者

2020-11-05 09:38:07

中介者模式

2023-09-15 10:33:41

算法數據結構

2009-11-09 16:14:49

WCF服務元數據

2020-12-01 07:16:05

重學設計模式

2021-01-21 05:34:14

設計模式建造者

2020-10-26 08:45:39

觀察者模式

2014-02-17 10:28:34

大數據

2023-11-07 12:00:05

分布式系統數據訪問

2021-06-08 06:01:00

C++數據結構向量和數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 1区2区3区视频 | 欧美日韩成人影院 | 91佛爷在线观看 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 国产片侵犯亲女视频播放 | 视频在线h | 91视频免费视频 | 成年人在线视频 | av网址在线 | 亚洲欧美日韩精品久久亚洲区 | 91av免费看| 亚洲二区视频 | a黄毛片| 精品国产一区二区三区免费 | 国产91久久久久久 | 久久精品视频免费看 | 国产精品久久久久久久久久久久 | 国产欧美日韩综合精品一区二区 | www国产亚洲精品久久网站 | 久久久这里都是精品 | 精品久久国产 | 亚洲综合成人网 | 久在草 | 一级毛片视频 | 亚洲小视频在线播放 | 午夜激情小视频 | 日韩在线大片 | 国产精品免费在线 | 九一在线观看 | 国产aa | 视频一区在线 | 久久99久久99精品免视看婷婷 | 欧美乱淫视频 | 黄色网页在线观看 | 夜夜夜久久久 | 色视频在线播放 | 狠狠骚 | 四虎影院新地址 | 91精品国产一区 | 中文字幕在线观看视频网站 | 亚洲欧美中文字幕在线观看 |