yii2通过url访问类中的方法_行为型设计模式 访问者模式
author zong
email zongzhe1996@163.com
介紹
在訪問者模式中,通過使用一個訪問者類,可以改變元素類(被訪問者)的執(zhí)行算法。元素類的執(zhí)行算法可以隨著訪問者的改變而改變 。使用訪問者對象操作元素對象,不同的訪問者可以靈活調整對元素對象的操作。
解決問題
主要解決了數據結構與數據操作的耦合問題,使得數據結構與數據的操作分離,可以靈活的調整針對同一個數據結構不同操作。
使用場景
一個對象結構需要面臨很多不同的操作,并且這些操作間互不相關,在設計過程中需要避免讓一個對象中包含多個與對象內容無關的操作,遵守單一職責原則。
解決思路
在被訪問的類中添加一個用來接待訪問者的接口,在這個接口中,被訪問的類將自己的引用傳遞給訪問者。
具體實現
本節(jié)給出一種訪問者模式最常用的設計方案,主要結構如下所示:
首先,創(chuàng)建一個元素類(被訪問者)的抽象接口。
public interface VisitedPart{
//用來接待訪問者的接口
public void accept(VistorPart vp);
}
其次,創(chuàng)建上述抽象接口的實體類。
public class VisitedPart1 implements VisitedPart{
public void accept(VistorPart vp){
//訪問者在這個接口中對this引用指向的對象進行訪問。
vp.visit(this)
}
}
public class VisitedPart2 implements VisitedPart{
public void accept(VistorPart vp){
vp.visit(this)
}
}
public class VisitedPart3 implements VisitedPart{
public void accept(VistorPart vp){
vp.visit(this)
}
}
public class TopVisitedPart1 implements VisitedPart{
VisitedPart[] parts;
public TopTopVisitedPart1(){
parts = new VisitedPart[]{
new VisitedPart1(),
new VisitedPart2(),
new VisitedPart3()};
}
public void accept(VistorPart vp){
for (VisitedPart vedp in parts){
vedp.accept(vp);
}
vp.visit(this)
}
}
然后,定義訪問者的抽象接口。
public interface VisitorPart{
public void visit(VisitedPart1 vedp1);
public void visit(VisitedPart2 vedp2);
public void visit(VisitedPart3 vedp3);
public void visit(TopVisitedPart1 vedp4);
}
對訪問者的操作進行具體實現。
public class ConcreteVisitor implements VisitorPart{
public void visit(VisitedPart1 vedp1){
sout("Visit One");
}
public void visit(VisitedPart2 vedp2){
sout("Visit Two");
}
public void visit(VisitedPart3 vedp3){
sout("Visit Three");
}
public void visit(TopVisitedPart1 vedp4){
sout("Visit Top");
}
}
最后,在主函數中展示使用過程。
void main(String[] args) {
VisitedPart vedp = new TopVisitedPart1();
vedp.accept(new ConcreteVisitor());
}
缺點
具體元素對訪問者公布細節(jié),違反了迪米特原則。
具體元素變更比較困難。
違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。
總結
作者最初以為訪問者模式還違反了開閉原則,因為添加新的被訪問者需要在 VisitorPart和 ConcreteVisitor中增加新的方法。但是后來仔細想想好像不用,可以創(chuàng)建一個新接口 VisitorNew繼承 VisitorPart并添加適用于新的被訪問者的方法,然后在 VisitorNew的實現類中實現新增加的方法即可。對于 ConcreteVisitor已經實現過的方法不用再實現。訪問原有被訪問者就仍然使用 ConcreteVisitor,需要訪問新的被訪問者的時候再用 VisitorNew的實現類。
但是這樣有個問題,如果多次調整添加了很多被訪問者的話,就會產生大量的接口繼承和多層繼承結構,會使程序結構變得復雜,到這里作者設計模式還沒有學完,后面學完后可能會有新的設計思路,這里暫時先提出一種改進思路。將上述實現過程中的訪問者接口( VisitorPart)中的四個訪問方法下放到實現類中。將 VisitorPart進一步抽象。
public interface VisitorPart{
//訪問者方法的參數抽象為被訪問者的抽象接口
public void visit(VisitedPart vedp);
}
并將不同的訪問方法下放到實現類中實現
public class ConcreteVisitor1 implements VisitorPart{
public void visit(VisitedPart vedp){
//由于需要進行強制類型轉換,因此需要進行異常處理。
VisitedPart1 vedp1 = (VisitedPart1) vedp
sout("Visit One");
}
}
public class ConcreteVisitor2 implements VisitorPart{
public void visit(VisitedPart vedp){
//由于需要進行強制類型轉換,因此需要進行異常處理。
VisitedPart2 vedp2 = (VisitedPart2) vedp
sout("Visit Two");
}
}
public class ConcreteVisitor3 implements VisitorPart{
public void visit(VisitedPart vedp){
//由于需要進行強制類型轉換,因此需要進行異常處理。
VisitedPart1 vedp3 = (VisitedPart3) vedp
sout("Visit Three");
}
}
public class TopPartVisitor implements VisitorPart{
public void visit(VisitedPart vedp){
//由于需要進行強制類型轉換,因此需要進行異常處理。
TopVisitedPart1 tvedp = (TopVisitedPart1) vedp
sout("Visit Top");
}
}
最后,在主函數中展示使用過程。
void main(String[] args) {
VisitedPart vedp = new TopVisitedPart1();
vedp.accept(new TopPartVisitor());
}
這樣調整后,如果添加了新的被訪問者,就直接添加一個 VisitorPart的實現類。
總結
以上是生活随笔為你收集整理的yii2通过url访问类中的方法_行为型设计模式 访问者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于JTAG——韦东山嵌入式Linux视
- 下一篇: 如何告别半途而废——韦东山嵌入式Linu