(精華)2020年8月30日 二十三種設(shè)計模式(二十三)-訪問者模式(Vistor Pattern)

      網(wǎng)友投稿 700 2025-04-01

      訪問者模式(Vistor Pattern)


      訪問者模式屬于行為型模式,表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用于這些元素的新操作。

      結(jié)構(gòu)對象是使用訪問者模式必備條件,而且這個結(jié)構(gòu)對象必須存在遍歷自身各個對象的方法。

      角色

      1、抽象訪問者(Visitor)

      為該對象結(jié)構(gòu)中具體元素角色聲明一個訪問操作接口。該操作接口的名字和參數(shù)標(biāo)識了發(fā)送訪問請求給具體訪問者的具體元素角色,這樣訪問者就可以通過該元素角色的特定接口直接訪問它;

      2、具體訪問者(Concrete Visitor)

      實現(xiàn)Visitor聲明的接口;

      3、抽象元素(Element)

      定義一個接受訪問操作,它以一個訪問者(Visitor)作為參數(shù);

      4、具體元素(Concrete Element )

      實現(xiàn)了抽象元素所定義的接受操作接口;

      5、結(jié)構(gòu)對象(Object Structure)

      可以提供一個高層接口以允許訪問者訪問它的元素。

      示例

      命名空間VistorPattern中包含Student學(xué)生基類充當(dāng)抽象元素,它的3個實現(xiàn)類Kris、Cherry和Harling分別是我的兒子、女兒和侄女的英文名,它們充當(dāng)具體元素角色。ITeacher接口充當(dāng)抽象訪問者,而Teacher類充當(dāng)具體訪問者。花名冊類Roster充當(dāng)結(jié)構(gòu)對象。本案例嘗試使用老師根據(jù)花名冊來進(jìn)行家訪這樣的場景來講述訪問者模式的使用方法。

      public abstract class Student { public string Name { get; protected set; } public Student(string name) { Name = name; } public abstract void Accept(ITeacher teacher); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      學(xué)生基類Student,代表抽象元素。

      public class Kris : Student { public Kris(string name) : base(name) { } public override void Accept(ITeacher teacher) { teacher.Visit(this); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      Kris類,代表某一具體學(xué)生。

      public class Cherry : Student { public Cherry(string name) : base(name) { } public override void Accept(ITeacher teacher) { teacher.Visit(this); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      Cherry類,代表某一具體學(xué)生。

      public class Harling : Student { public Harling(string name) : base(name) { } public override void Accept(ITeacher teacher) { teacher.Visit(this); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      Harling類,代表某一具體學(xué)生。

      public interface ITeacher { void Visit(Student student); }

      1

      2

      3

      4

      5

      ITeacher接口,代表抽象訪問者。

      public class Teacher : ITeacher { private string _name = null; public Teacher(string name) { _name = name; } public void Visit(Student student) { Console.WriteLine($"Mr.{_name} is going to visit {student.Name}'s home. "); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      Teacher類,代表具體訪問者。

      public class Roster { public List Students { get; private set; } public Roster() { Students = new List { new Cherry("Cherry"), new Kris("Kris"), new Harling("Harling") }; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      Roster類,代表花名冊,充當(dāng)結(jié)構(gòu)對象,老師根據(jù)這個對象來進(jìn)行家訪。

      public class Program { public static void Main(string[] args) { Roster roster = new Roster(); foreach(var student in roster.Students) { student.Accept(new Teacher("Tony")); } Console.Read(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      (精華)2020年8月30日 二十三種設(shè)計模式(二十三)-訪問者模式(Vistor Pattern)

      以上是調(diào)用方的代碼,以下是這個案例的輸出結(jié)果:

      Mr.Tony is going to visit Cherry's home. Mr.Tony is going to visit Kris's home. Mr.Tony is going to visit Harling's home.

      1

      2

      3

      優(yōu)點

      1、符合單一職責(zé)原則,凡是適用訪問者模式的場景中,元素類中需要封裝在訪問者中的操作必定是與元素類本身關(guān)系不大且是易變的操作,使用訪問者模式一方面符合單一職責(zé)原則,另一方面,因為被封裝的操作通常來說都是易變的,所以當(dāng)發(fā)生變化時,就可以在不改變元素類本身的前提下,實現(xiàn)對變化部分的擴(kuò)展;

      2、擴(kuò)展性良好,元素類可以通過接受不同的訪問者來實現(xiàn)對不同操作的擴(kuò)展。

      缺點

      1、增加新的元素類變得困難,每增加一個新的元素意味著要在抽象訪問者角色中增加一個新的抽象操作,并在每一個具體訪問者類中添加相應(yīng)的具體操作。

      使用場景

      1、一個對象結(jié)構(gòu)包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作;

      2、需要對一個對象結(jié)構(gòu)中的對象進(jìn)行很多不同的并且不相關(guān)的操作,而你想避免讓這些操作“污染”這些對象的類。Visitor模式使得你可以將相關(guān)的操作集中起來 定義在一個類中;

      3、當(dāng)該對象結(jié)構(gòu)被很多應(yīng)用共享時,用Visitor模式讓每個應(yīng)用僅包含需要用到的操作;

      4、定義對象結(jié)構(gòu)的類很少改變,但經(jīng)常需要在此結(jié)構(gòu)上定義新的操作。改變對象結(jié)構(gòu)類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結(jié)構(gòu)類經(jīng)常改變,那么可能還是在這些類中定義這些操作較好。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:數(shù)字生產(chǎn)管理體系(數(shù)字生產(chǎn)管理體系包括哪些)
      下一篇:績效補貼流程圖制作模板(績效補貼方案)
      相關(guān)文章
      亚洲永久在线观看| 亚洲无人区视频大全| 亚洲熟妇无码AV不卡在线播放| 久久亚洲精品人成综合网| 亚洲第一AAAAA片| 亚洲日韩国产精品第一页一区| 亚洲乱码国产一区网址| 亚洲国产精品一区二区九九| 在线观看亚洲专区| 一级毛片直播亚洲| 亚洲精品无码99在线观看| 亚洲日韩中文字幕日韩在线| 精品国产人成亚洲区| 在线精品亚洲一区二区小说| 亚洲精品无码MV在线观看| 亚洲国产精品无码中文字| 欧洲亚洲国产清在高| 亚洲AV无码成人精品区在线观看 | 婷婷久久久亚洲欧洲日产国码AV| 亚洲av永久无码精品网站| 亚洲AV无码一区二区三区DV | 婷婷精品国产亚洲AV麻豆不片 | 午夜亚洲乱码伦小说区69堂| 亚洲精品视频免费| 亚洲日韩精品一区二区三区| 亚洲国产成人一区二区精品区| 亚洲热妇无码AV在线播放| 亚洲阿v天堂在线| 亚洲黄色在线观看视频| 亚洲依依成人精品| 亚洲人成网站免费播放| 在线亚洲精品视频| 激情婷婷成人亚洲综合| 区三区激情福利综合中文字幕在线一区亚洲视频1| 亚洲美日韩Av中文字幕无码久久久妻妇| 亚洲人成精品久久久久| 亚洲国产精品一区二区久久| 亚洲成人免费网站| 亚洲暴爽av人人爽日日碰| 亚洲人成人无码网www国产| 国产aⅴ无码专区亚洲av|