在講解訪問者模式之前,我們先來看乙個例子:假設現階段公司的技術部門要求員工彙總各自的基礎資訊,以及工作內容。
**結構如下:
public
class
visitor_01
public
void
report()
public
abstract string getotherinfo()
;}//管理層
static
class
leader
extends
employee
@override
public string getotherinfo()
}//普通員工
static
class
commonemploee
extends
employee
@override
public string getotherinfo()
}public
static
void
main
(string[
] args)
}}
這是乙個最基礎的,使用了模板方法的乙個設計。這裡的report()是乙個模板方法,定義了所有員工報告格式的大致框架,但是作為領導和普通員工的區別來講,報告的格式和內容會有一些區別。如果領導類和普通員工類都遵循這個模板方法的話,一旦改方法結構變化,就會影響到所有的子類,這不是我們想要看到的。我們期望的設計是,員工和領導的報告細節的變更互不影響。
在這個例項裡,普通員工類和領導類都是屬於被大老闆訪問的物件,這個時候大老闆就是乙個訪問者,只是他訪問的物件不一樣而已,有可能是領導,有可能是普通員工。那我們作為下級員工來講,必須是允許領導來訪問的;但是大老闆訪問下級員工到底想要知道些什麼呢,這就應該由大老闆自己來決定才行,因為下屬資訊對大老闆都是透明的。
下面修改下設計:
public
class
visitor_02
static
class
visitor
implements
ivisitor
@override
public
void
visitor
(commonemploee commonemploee)
}//員工抽象類
abstract
static
class
employee
public string getname()
public
void
setname
(string name)
public
intgetsalary()
public
void
setsalary
(int salary)
public string getjob()
public
void
setjob
(string job)
public
abstract
void
accept
(ivisitor ivisitor);}
//管理層
static
class
leader
extends
employee
@override
public
void
accept
(ivisitor ivisitor)
}//普通員工
static
class
commonemploee
extends
employee
@override
public
void
accept
(ivisitor ivisitor)
}public
static
void
main
(string[
] args)
}}
如上**:
定義乙個訪問者介面,定義訪問不同具體物件的方法;以上就是訪問者模式的基本設計**以及思路,下面看看官方的訪問者模式的定義:封裝一些作用於某種資料結構中的各個元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新操作。定義乙個抽象的類,提供乙個接收訪問者的抽象方法,由子類實現;
定義乙個具體的訪問者實現類,來訪問具體的被訪問者,並進行邏輯處理;
具體的被訪問物件的像訪問者暴露自己的所有資訊。
簡單來講,就是暴露自己資訊或結構給訪問者,讓訪問者自己來實現邏輯。這樣邏輯的變更不會影響到自己內部的結構。
但是由於visitor方法接收到的都是具體的類例項,並不是面向介面程式設計,所以擴充套件性不好。
訪問者模式(行為型)
在實際開發中也會遇到這種情況,有乙個屬性類e,有abcd四個屬性,另外有四個類abcd,要去訪問類e,a只訪問屬性a,b只訪問屬性b,c只訪問屬性c,d只訪問屬性d。這時候訪問者模式就派上用場了。定義 封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變這個資料結構的前提下定義作用於這些元素的...
訪問者模式(行為型)
在大話設計模式一書中提到一種場景,男人和女人在面對不同的事情時會有不同的反應,例如成功 失敗 結婚 戀愛等等,在這種結構相對穩定 只有男人和女人 而遇到的情況多變的情形下,我們就可以用訪問者模式來實現,還是先看下面的介紹吧。1 定義 表示乙個作用於某物件結構中的各元素的操作。它可以使你在不改變各元素...
Java設計模式 行為型 訪問者模式
這個世界上存在很多事情,每個人都有各自要做的事情,有屬於你的事情,當然也有屬於我的事情,不過我們都在為各自的事情努力奮鬥。這個世界存在的很多事情 public inte ce goal 我有我的目標 public inte ce yougoal 你有你的目標 public inte ce megoa...