訪問者模式
是解耦資料和操作,但是資料必須是穩定的,這樣使增加操作變得更容易。
表示乙個作用於某物件結構中的各元素的操作。他使你可以不改變各個元素類的情況下定義作用於這些元素的新操作。訪問者模式需要穩定的資料結構才能發揮作用,然而很少有穩定的資料結構。
當然不是說不穩定的資料結構不能用訪問者模式,只不過,增加乙個資料結構比較麻煩。因為你需要更改所有的操作。。。。
所以這個設計模式你可能一直都用不到。。。
不過如果真的有需要,那麼用它就沒錯了。
什麼是穩定的資料結構呢?
比如男人,女人,人妖。
比如小孩,大人。
這些不會改變的東西。那麼操作是什麼呢?
比如開心,快樂,事業成功等等。
首先,定義乙個訪問者介面,也可以說是操作介面。
/**
* 訪問者模式
* 操作介面,裡面定義了幾個資料結構的操作方法
*/inte***ce
visitor
現在來實現一些操作,比如開心
/**
* 訪問者模式
* 具體操作,開心,實現了每個資料結構的開心
*/class
implements
visitor
//女人的操作
function
women
(women $women
)//人妖的操作
function
simon
(simon $simon
)}
比如事業成功
/**
* 訪問者模式
* 具體操作,事業成功,實現了每個資料結構的事業成功
*/class
success
implements
visitor
//女人的操作
function
women
(women $women
)//人妖的操作
function
simon
(simon $simon
)}
現在操作都實現了,我們需要實現資料結構了,也就是男人,女人,人妖。
/**
* 訪問者模式
* 資料結構
*/abstract
class
person
/** * 訪問者模式
* 男人類
*/class
manextends
person
}/**
* 訪問者模式
* 女人類
*/class
women
extends
person
}/**
* 訪問者模式
* 人妖類
*/class
simon
extends
person
}
那客戶端怎麼呼叫呢?
$man
=new
man();
$man
->
accept
(new);
$man
->
accept
(new
success);
$women
=new
women()
;$women
->
accept
(new);
$women
->
accept
(new
success
);
這樣的話就可以實現訪問者模式了,如果我們需要新增操作,只需要新增乙個操作類然後實現每個資料結構的方法就好了。
但是我們要新增資料結構就麻煩了,要修改所有的操作類。
其實操作類的三個方法可以合併成乙個,都接受person
型別的引數,但是如果這三個資料型別的操作不一樣呢?所以還是分成三個比較好。
**放在了我的github上面。
設計模式之訪問者模式
先看一下下面這段 class person public string getaction public void setaction string action public void getconclusion else if action exciting else if action gri...
設計模式之訪問者模式
我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何乙個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中 對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水,明天來銀行可能是去辦理手機銀行業...
設計模式之訪問者模式
定義 表示一介作用於某個物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。結構圖 示例 public inte ce vistor public class concretevisitor1 implements vistor override public ...