先看一下下面這段**
class person
public string getaction()
public void setaction(string action)
public void getconclusion()
else if(action == "exciting")
else if(action == "grieved") }}
public class client
}
如果需要新增一種feeling那麼需要去改動person類,這裡違背了開放封閉原則,getconclusion()需要對每種feeling都分別做操作,這裡違背了單一職責原則.現在我們利用訪問者模
式就可以就可以避免違反的兩種原則.
表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素類的前提下定義作用於這些元素的新操作。
涉及角色:
1.visitor 抽象訪問者角色,為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請求給具體訪問者的具體元素角色,這樣訪問者就可以通過該元素角色的特定介面直接訪問它。
2.concretevisitor.具體訪問者角色,實現visitor宣告的介面。
3.element 定義乙個接受訪問操作(accept()),它以乙個訪問者(visitor)作為引數。
4.concreteelement 具體元素,實現了抽象元素(element)所定義的接受操作介面。
5.objectstructure 結構物件角色,這是使用訪問者模式必備的角色。它具備以下特性:能列舉它的元素;可以提供乙個高層介面以允許訪問者訪問它的元素;如有需要,可以設計成乙個復合物件或者乙個聚集(如乙個列表或無序集合)。
訪問者模式的幾個特點:
訪問者模式把
資料結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。
訪問者模式適用於
資料結構相對穩定演算法又易變化的系統。因為訪問者模式使得演算法操作增加變得容易。若系統
資料結構物件易於變化,經常有新的
資料物件增加進來,則不適合使用訪問者模式。
訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到乙個訪問者物件中,其改變不影響系統
資料結構。其缺點就是增加新的
資料結構很困難。
我們根據之前的需求和訪問者模式的概念設計出uml:
具體**:
state.class
public abstract class state
@override
public void eflectperson(person person) }
grieved.class
public class grieved extends state
}
exciting.class
public class exciting extends state
}
person.class
public class person
public string getname()
public void setname(string name)
//雙分派
public void receivestate(state state)
}
這裡解釋一下什麼叫雙分派:假設有a,b兩個物件,物件a中有乙個方法需要用到物件b的引用,而在這個方法中去呼叫物件b的方法會用到物件a的引用。它使得執行結果不僅取決
於b類而且還取決於a類.
personstructure.class
public class personstructure
public void remove(person person)
public void displaypersonname()
} public void receivestate(state state)
}}
client.class
public class client
}
最後輸出: 設計模式之訪問者模式
我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何乙個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中 對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水,明天來銀行可能是去辦理手機銀行業...
設計模式之訪問者模式
定義 表示一介作用於某個物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。結構圖 示例 public inte ce vistor public class concretevisitor1 implements vistor override public ...
設計模式之訪問者模式
定義 表示乙個作用於某物件結構中的各元素的操作,它使得使用者可以再不改變各元素的累的前提下定義作用於這些元素的新操作,它是一種物件行為模式。類圖 說明 抽象訪問者visitor是乙個抽象訪問者,宣告訪問者可以訪問哪些元素 具體訪問者concretevisitor就是指訪問者訪問到乙個類後要做什麼事情...