<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                **定義:**訪問者模式(Vistor Pattern),表示一個作用于對象結構中各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。 **類型:**對象行為型模式。 概述: ????????訪問者模式適用的場合比較狹窄,因為它的要求非常嚴。ConcreteElement要求具有一樣的算法接口,并且ConcreteVisitor也要求一樣的接口,這兩點就使得訪問者模式的使用范圍比較窄。在《Head First Design Patterns》中也將訪問者模式列為非常用模式之一。 ?????????舉一個例子,有一個倉庫(對象結構),里面儲存不同的電器(元素),如電視、電腦(具體元素),倉庫可以按電器新舊或大小(具體的訪問者)來擺放電器產品。 類圖: ![](https://box.kancloud.cn/2016-08-19_57b6b467f2b12.jpg) 參與者: 1. Client:構建抽象的訪問者以及結構體對象。 1. Storage,具體生成并存儲不同的商品(如Television、Computer)。 1. Goods,抽象商品類。 1. Television、Computer,具體的商品類,對相應的屬性完成賦值。 1. Place,抽象的訪問者類,提供抽象訪問方法。 1. State、Size,具體的訪問者類,根據相應商品屬性來實現具體的擺放方法Put()。 示例代碼: ~~~ using System; using System.Collections.Generic; using System.Text; namespace Pattern24 { abstract class Visitor { public abstract void PutTelevision(Television tv); public abstract void PutComputer(Computer comp); } class SizeVisitor : Visitor { public override void PutTelevision(Television tv) { Console.WriteLine("按商品大小{0}排放", tv.Size); } public override void PutComputer(Computer comp) { Console.WriteLine("按商品大小{0}排放", comp.Size); } } class StateVisitor : Visitor { public override void PutTelevision(Television tv) { Console.WriteLine("按商品新舊值{0}排放", tv.State); } public override void PutComputer(Computer comp) { Console.WriteLine("按商品新舊值{0}排放", comp.State); } } abstract class Goods { public abstract void Operate(Visitor visitor); private int nSize; public int Size { get {return nSize;} set {nSize = value;} } private int nState; public int State { get {return nState;} set {nState = value;} } } class Television : Goods { public override void Operate(Visitor visitor) { visitor.PutTelevision(this); } } class Computer : Goods { public override void Operate(Visitor visitor) { visitor.PutComputer(this); } } class Storage { private IList<Goods> list = new List<Goods>(); public void Attach(Goods element) { list.Add(element); } public void Detach(Goods element) { list.Remove(element); } public void Operate(Visitor visitor) { foreach (Goods e in list) { e.Operate(visitor); } } } class Program { static void Main(string[] args) { Storage storage = new Storage(); storage.Attach(new Television()); storage.Attach(new Computer()); SizeVisitor v1 = new SizeVisitor(); StateVisitor v2 = new StateVisitor(); storage.Operate(v1); storage.Operate(v2); Console.Read(); } } } ~~~ 適用性: 1. 一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作。 1. 需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。 Visitor使得你可以將相關的操作集中起來定義在一個類中。 當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。 1. 定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。 改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。 如果對象結構類經常改變,那么可能還是在這些類中定義這些操作較好**???????????????** 優缺點: 1. 優點,完成新的模板方法是不用修改原有代碼,通過添加新代碼完成。 1. 缺點,當使用訪問者模式時,打破了組合模式。 參考資料: 1. 《設計模式——可復用面向對象軟件基礎》 1. 《大話設計模式》
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看