優勢:spa
① 能夠在不改變各元素的類的前提下,定義做用於這些元素的新操做新狀態,將元素和做用於元素之上的操做之間的耦合解脫開,使得操做能夠相對集中和自由變化增減。code
② 對於元素操做或狀態,具備良好的靈活性和擴展性。對象
缺點:blog
① 增長新的對象結構(即對象元素)Element很困難,須要改動多。it
適用範圍:class
該模式適合於對象結構(即對象元素)相對穩定、且有易於變化的操做或狀態的系統擴展
客戶端:方法
ObjectStructure o = new ObjectStructure(); //對象結構
o.add(new ConcreteElement1()); //男人
o.add(new ConcreteElement2()); //女人
Visitor success = new ConcreteVisitor1();//成功
o.display(success); //展現
Visitor fail = new ConcreteVisitor2();//失敗
o.display(fail); //展現
Visitor love = new ConcreteVisitor3();//戀愛
o.display(love); //展現im
//打印結果 客戶端
男人成功時,背後多半有個偉大的女人
女人成功時,背後大多有個不成功的男人
男人失敗時,悶頭喝酒,誰也不用勸
女人失敗時,眼淚汪汪,誰也勸不了
男人戀愛時,凡事不懂也要裝懂
女人戀愛時,遇事懂也裝不懂
/** * ObjectStructure 對象結構類(添加、刪除和展現全部元素的方法) * Element 抽象的對象元素(獲取元素狀態的方法) * ConcreteElement1 男人 ConcreteElement2 女人 -- 元素實例化 * * Visitor 元素狀態抽象類(分別獲知男人和女人狀態的方法) * ConcreteVisitor1 成功狀態(男女) ConcreteVisitor2 失敗狀態(男女) ConcreteVisitor3 戀愛狀態(男女) -- 實例化狀態 */