精華)2020年8月31日 計算機(jī)操作系統(tǒng) IO概念和五種IO模型">(精華)2020年8月31日 計算機(jī)操作系統(tǒng) IO概念和五種IO模型
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
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
以上是調(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)容。