国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實現

這篇具有很好參考價值的文章主要介紹了【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實現。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

簡介

訪問者模式(Visitor Pattern)是一種行為型模式。它封裝一個訪問者類,把各元素類的操作集合起來,目的是將數據結構與數據操作分離。在不改變原有元素類數據結構的前提下,改變了元素類的執(zhí)行算法。

當某些較為穩(wěn)定的東西(數據結構或算法),不想直接被改變但又想擴展功能,這時候適合用訪問者模式。訪問者模式的使用頻率并不是很高,大多數情況下,你并不需要使用訪問者模式,但是當你一旦需要使用它時,那你就是需要使用它了。

訪問者模式有以下幾個角色:

  • 結構對象(ObjectStructure):結構對象角色,這是訪問者模式的基礎角色,包含多個類或者接口.
  • 抽象元素(Element):定義一個接受訪問操作accept(),以一個訪問者Visitor作為參數。
  • 具體元素(ConcreteElement):實現抽象節(jié)點的accept()方法和處理操作,調用Vistor的訪問方法實現具體功能。
  • 抽象訪問者(Visitor):定義一個抽象接口,聲明一個或多個訪問操作,使得所有具體訪問者都必須實現。
  • 具體訪問者(ConcreteVisitor):具體訪問者角色,實現Visitor聲明的接口。

作用

  1. 在數據基礎類里面有一個方法接受訪問者,將自身引用傳入訪問者,從而把不變的固定起來,把變化的開放出去。
  2. 通過隔離類中變化的東西,固定不變的東西,符合單一職責原則,同時具備較好的擴展性和靈活性。

實現步驟

  1. 先創(chuàng)建基本元素抽象類Element,確定accept()抽象方法。
  2. 分別創(chuàng)建幾個具體的元素類,實現抽象元素的accept方法。
  3. 在創(chuàng)建Visitor抽象接口,定義visit方法,調用具體元素。
  4. 創(chuàng)建1個或多個Visitor類,繼承抽象接口,客戶將以此去訪問具體元素。
  5. 再創(chuàng)建對象結構類,這是核心入口類,負責組合各種元素,以及傳遞訪問者Visitor。
  6. 客戶調用時先創(chuàng)建對象結構類,再指定訪問者類,通過訪問這類調用具體元素類

UML

【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實現

?

Java代碼

結構對象

// ObjectStructure.java 結構對象(ObjectStructure)
public class ObjectStructure {

  // 可以想象為一臺電腦,聚合了各種設備元素
  private String name = "Computer Structure";
  private List<Element> elements = new ArrayList<Element>();

  // 結構對象初始化聚合了其他元素
  public ObjectStructure() {
    addElement(new ConcreteElementA());
    addElement(new ConcreteElementB());
  }

  public void addElement(Element element) {
    elements.add(element);
  }

  // 傳入訪問者分發(fā)給其他元素
  public void accept(Visitor visitor) {
    System.out
        .println("ObjectStructure::accept() [visitor.class = " + visitor.getClass().getSimpleName() + " visitor.name = "
            + visitor.getName() + "]");
    for (Element element : elements) {
      element.accept(visitor);
    }
  }

  public String getName() {
    return this.name;
  }

}

抽象訪問者類

// Visitor.java 訪問者Visitor抽象接口,定義不同的visit方法
public interface Visitor {
  public void visit(ConcreteElementA concreteElementA);

  public void visit(ConcreteElementB concreteElementB);

  public String getName();
}

具體訪問者

// ConcreteVisitorA.java 具體訪問者A
public class ConcreteVisitorA implements Visitor {

  // 假如由不同廠商是程序的訪問者
  private String name = "Google Visitor";

  @Override
  public void visit(ConcreteElementA concreteElementA) {
    System.out.println(
        "ConcreteVisitorA::visit() [Element.class = " + concreteElementA.getClass().getSimpleName()
            + " Element.name = "
            + concreteElementA.getName() + "]");
    concreteElementA.operate();
  }

  @Override
  public void visit(ConcreteElementB concreteElementB) {
    System.out.println("ConcreteVisitorA::visit() [Element.class = " + concreteElementB.getClass().getSimpleName()
        + " Element.name = "
        + concreteElementB.getName() + "]");
    concreteElementB.operate();
  }

  public String getName() {
    return this.name;
  }
}
// ConcreteVisitorB.java 具體訪問者B
public class ConcreteVisitorB implements Visitor {

  // 假如由不同廠商是程序的訪問者
  private String name = "Apple Visitor";

  @Override
  public void visit(ConcreteElementA concreteElementA) {
    System.out.println(
        "ConcreteVisitorB::visit() [Element.class = " + concreteElementA.getClass().getSimpleName()
            + " Element.name = "
            + concreteElementA.getName() + "]");
    concreteElementA.operate();
  }

  @Override
  public void visit(ConcreteElementB concreteElementB) {
    System.out.println(
        "ConcreteVisitorB::visit() [Element.class = " + concreteElementB.getClass().getSimpleName()
            + " Element.name = "
            + concreteElementB.getName() + "]");
    concreteElementB.operate();
  }

  public String getName() {
    return this.name;

  }
}

抽象元素類

// Element.java 抽象元素(Element),定義accept方法,傳入抽象訪問者
abstract class Element {
  public abstract void accept(Visitor visitor);
}

具體元素實現類

// ConcreteElementA.java 具體的元素實現者A
public class ConcreteElementA extends Element {
  // 可以設想為顯示器
  private String name = "Monitor Element";

  @Override
  public void accept(Visitor visitor) {
    System.out
        .println(
            "ConcreteElementA::accept() [visitor.class = " + visitor.getClass().getSimpleName() + " visitor.name = "
                + visitor.getName() + "]");
    visitor.visit(this);
  }

  public void operate() {
    System.out.println("ConcreteElementA::operate() [" + this.getName() + "]");
  }

  public String getName() {
    return this.name;
  }
}
// ConcreteElementB.java 具體的元素實現者B
public class ConcreteElementB extends Element {
  private String name = "Keyboard Element";

  @Override
  public void accept(Visitor visitor) {
    System.out.println(
        "ConcreteElementB::accept() [visitor.class = " + visitor.getClass().getSimpleName() + " visitor.name = "
            + visitor.getName() + "]");
    visitor.visit(this);
  }

  public void operate() {
    System.out.println("ConcreteElementB::operate() [" + this.getName() + "]");
  }

  public String getName() {
    return this.name;
  }
}

測試調用

  /**
   * 訪問者模式是當客戶需要訪問具體各元素Element時,先建立一個訪問者Visitor作為媒介
   * 客戶基于對象結構ObjectStructure,調用accept(),接受傳入的訪問者
   * 對象結構向其他元素負責分發(fā)訪問者,元素對象接受之后會將自己回傳給訪問者,從而訪問者可以訪問具體元素
   */
    ObjectStructure structure = new ObjectStructure();
    // 接受訪問者A,把訪問者傳遞給具體元素
    structure.accept(new ConcreteVisitorA());

    System.out.println("====");
    // 接受訪問者B,把訪問者傳遞給具體元素
    structure.accept(new ConcreteVisitorB());

Go代碼

結構對象

// ObjectStructure.go 結構對象(ObjectStructure)
type ObjectStructure struct {
  name     string
  elements []Element
}

func (o *ObjectStructure) AddElement(e Element) {
  o.elements = append(o.elements, e)
}

// 傳入訪問者分發(fā)給其他元素
func (o *ObjectStructure) Accept(v Visitor) {
  fmt.Println(
    "ObjectStructure::Accept() [Visitor.name = " +
      v.GetName() + "]")

  // 通知全部元素成員接受訪問者
  for i := 0; i < len(o.elements); i++ {
    o.elements[i].Accept(v)
  }

  // for _, ele := range o.elements {
  //   ele.Accept(v)
  // }
}

func (o *ObjectStructure) GetName() string {
  o.name = "Computer Structure"
  return o.name
}

// 結構對象的初始化函數
func (o *ObjectStructure) Init() {
  // 可以想象為一臺電腦,聚合了各種設備元素
  fmt.Println("ObjectStructure::Init() ", o.GetName())
  // 定義一個對象數組,長度可選
  o.elements = make([]Element, 0, 100)

  // 結構對象初始化聚合了其他元素
  o.AddElement(&ConcreteElementA{})
  o.AddElement(&ConcreteElementB{})
}

抽象訪問者類

// Visitor.go 訪問者Visitor抽象接口,定義不同的visit方法
type Visitor interface {
  VisitA(e *ConcreteElementA)
  VisitB(e *ConcreteElementB)
  GetName() string
}

具體訪問者

// ConcreteVisitorA.go 具體訪問者A
type ConcreteVisitorA struct {
  name string
}

func (v *ConcreteVisitorA) GetName() string {
  v.name = "Google Visitor(struct=ConcreteVisitorA)"
  return v.name
}

func (v *ConcreteVisitorA) VisitA(e *ConcreteElementA) {
  fmt.Println(
    "ConcreteVisitorA::VisitA() [Element.name = " + e.GetName() + "]")
  e.Operate()
}

func (v *ConcreteVisitorA) VisitB(e *ConcreteElementB) {
  fmt.Println(
    "ConcreteVisitorA::VisitB() [Element.name = " + e.GetName() + "]")
  e.Operate()
}
// ConcreteVisitorB.go 具體訪問者B
type ConcreteVisitorB struct {
  name string
}

func (v *ConcreteVisitorB) GetName() string {
  v.name = "Apple Visitor(struct=ConcreteVisitorB)"
  return v.name
}

func (v *ConcreteVisitorB) VisitB(e *ConcreteElementB) {
  fmt.Println(
    "ConcreteVisitorB::VisitB() [Element.name = " + e.GetName() + "]")
  e.Operate()
}

func (v *ConcreteVisitorB) VisitA(e *ConcreteElementA) {
  fmt.Println(
    "ConcreteVisitorB::VisitA() [Element.name = " + e.GetName() + "]")
  e.Operate()
}

抽象元素類

// Element.go 抽象元素(Element),定義accept方法,傳入抽象訪問者
// go無抽象類,用interface替代
type Element interface {
  Accept(v Visitor)
  Operate()
  GetName() string
}

具體元素實現類

// ConcreteElementA.go 具體的元素實現者A
type ConcreteElementA struct {
  name string
}

func (c *ConcreteElementA) GetName() string {
  c.name = `Monitor Element(struct=ConcreteElementA)`
  return c.name
}

func (e *ConcreteElementA) Accept(v Visitor) {
  fmt.Println(
    "ConcreteElementA::Accept() [Visitor.name = " + v.GetName() + "]")
  v.VisitA(e)
}

func (e *ConcreteElementA) Operate() {
  fmt.Println("ConcreteElementA::Operate() [" + e.GetName() + "]")
}
// ConcreteElementB.go 具體的元素實現者B
type ConcreteElementB struct {
  name string
}

func (c *ConcreteElementB) GetName() string {
  c.name = "Keyboard Element(struct=ConcreteElementB)"
  return c.name
}

func (e *ConcreteElementB) Accept(v Visitor) {
  fmt.Println(
    "ConcreteElementB::Accept() [Visitor.name = " + v.GetName() + "]")
  v.VisitB(e)
}

func (e *ConcreteElementB) Operate() {
  fmt.Println("ConcreteElementB::Operate() [" + e.GetName() + "]")
}

測試調用

func main() {
  fmt.Println("test start:")

  /**
   * 訪問者模式是當客戶需要訪問具體各元素Element時,先建立一個訪問者Visitor作為媒介
   * 客戶基于對象結構ObjectStructure,調用Accept(),接受傳入的訪問者
   * 對象結構向其他元素負責分發(fā)訪問者,元素對象接受之后會將自己回傳給訪問者,從而訪問者可以訪問具體元素
   */
  structure := src.ObjectStructure{}
  structure.Init()
  // 接受訪問者A,把訪問者傳遞給具體元素
  structure.Accept(&src.ConcreteVisitorA{})

  fmt.Println("====")
  // 接受訪問者B,把訪問者傳遞給具體元素
  structure.Accept(&src.ConcreteVisitorB{})
}

更多語言版本

不同語言設計模式源碼:https://github.com/microwind/design-pattern文章來源地址http://www.zghlxwxcb.cn/news/detail-433233.html

到了這里,關于【訪問者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 設計模式之-訪問者模式,快速掌握訪問者模式,通俗易懂的講解訪問者模式以及它的使用場景

    當談到訪問者模式時,我們可以通過以下方式進行詳細解釋: 訪問者模式是一種行為型設計模式,它允許你在不修改已有代碼的情況下,向現有對象結構添加新的操作。該模式將操作(或方法)封裝在稱為訪問者的獨立對象中,使得可以在不修改元素類的情況下,通過訪問者

    2024年02月03日
    瀏覽(27)
  • 設計模式—訪問者模式

    設計模式—訪問者模式

    ?需求:店鋪采購了一批水果(蘋果及橘子),現在市場監(jiān)督局來店里檢查過期的水果。 如果此時再添加一個操作:找出新品上市的水果。 上述代碼中,FruitMarket為應付新增操作,增加了相應的方法來滿足要求,但這樣破壞了FruitMarket的結構。 本質是將數據結構和數據操作分

    2024年02月10日
    瀏覽(22)
  • 設計模式——訪問者模式

    訪問者模式(Visitor Pattern)是一種行為型設計模式,它主要用于在不修改現有類結構的前提下向對象結構添加新的操作。訪問者模式通過定義一個訪問者接口,使得可以在不改變元素類的情況下,為各個元素類增加新的功能。 元素接口(Element Interface): 定義了一個accept()方法

    2024年01月18日
    瀏覽(35)
  • 設計模式——19. 訪問者模式

    訪問者模式(Visitor Pattern)是一種行為型設計模式,它允許你在不改變元素類(被訪問者)的前提下,定義對元素的新操作(訪問者),并將這些操作封裝到獨立的訪問者類中。這樣,你可以在不修改被訪問者的類的情況下,通過不同的訪問者來執(zhí)行不同的操作。 訪問者模式

    2024年02月07日
    瀏覽(23)
  • 設計模式之訪問者模式(下)

    設計模式之訪問者模式(下)

    3)訪問者模式與組合模式聯用 1.概述 在訪問者模式中,包含一個用于存儲元素對象集合的對象結構,可以使用迭代器來遍歷對象結構,同時具體元素之間可以存在整體與部分關系,有些元素作為容器對象,有些元素作為成員對象,可以使用組合模式來組織元素。 2.結構圖

    2024年04月25日
    瀏覽(31)
  • 設計模式之訪問者模式(上)

    設計模式之訪問者模式(上)

    訪問者模式 1)概述 1.概念 訪問者模式包含 訪問者 和 被訪問元素 兩個主要組成部分。 處方單中的各種藥品信息就是 被訪問的元素 ,而劃價人員和藥房工作人員就是 訪問者 ,被訪問的元素通常具有不同的類型,且不同的訪問者可以對它們進行不同的訪問操作。 被訪問元素

    2024年04月25日
    瀏覽(56)
  • js設計模式:訪問者模式

    js設計模式:訪問者模式

    將操作方法封裝在一個訪問者對象中,而不是封裝在每個被訪問對象當中。 訪問者對象可以通過調用被訪問者的接口,用來操作被訪問者。

    2024年02月22日
    瀏覽(36)
  • 設計模式:訪問者模式(C++實現)

    訪問者模式通過將對元素的操作與元素本身分離,使得可以在不修改元素類的情況下定義新的操作。 運行結果: 在上述代碼中,Visitor是訪問者接口,定義了訪問具體元素的方法。Element是元素接口,定義了接受訪問者訪問的方法。ConcreteElementA和ConcreteElementB是具體元素類,實

    2024年02月07日
    瀏覽(36)
  • 設計模式(二十三)訪問者

    設計模式(二十三)訪問者

    表示一個作用于某對象結構中的各個元素的操作。訪問者模式讓你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。訪問者模式是一種對象行為型模式 訪問者模式是一種較為復雜的行為型模式,它包含訪問者和被訪問元素兩個主要組成部分,這些被訪問的元素

    2024年02月19日
    瀏覽(21)
  • 【設計模式與范式:行為型】69 | 訪問者模式(下):為什么支持雙分派的語言不需要訪問者模式?

    上一節(jié)課中,我們學習了訪問者模式的原理和實現,并且還原了訪問者模式誕生的思維過程??傮w上來講,這個模式的代碼實現比較難,所以應用場景并不多。從應用開發(fā)的角度來說,它的確不是我們學習的重點。 不過,我們前面反復說過,學習我的專欄,并不只是讓你掌握

    2024年02月10日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包