在那一个算法类中封装了大批量搜索算法,大家得以根据条件依旧规格的两样选项区别的政策来形成该项任务

形式动机
图片 1

情势动机
图片 2

形式动机

完毕一项职分,往往能够有三种不一致的法门,每一种艺术叫做1个方针,大家得以根据条件依然规格的不等选项区别的政策来形成该项任务。
在软件开发中也平常遭受类似的境况,达成某二个功能有八个路子,此时得以运用一种设计情势来驱动系统能够灵活地采纳化解途径,也能够方便地增多新的消除途径。

做到一项任务,往往能够有多样区别的章程,每个形式叫做三个方针,大家能够依照环境照旧规格的例外取舍分化的策略来形成该项职分。
在软件开发中也时时遭受类似的事态,达成某三个功用有五个路子,此时能够使用一种设计格局来驱动系统能够灵活地接纳解决途径,也能够有利于地扩张新的搞定途径。

对此系统中的有些对象,它们存储在同贰个集结中,且全体不一致的种类,而且对于该集合中的目的,还不错一类称为访问者的对象来拜会,而且差异的访问者其访问格局有所区别,访问者格局为斩草除根那类难题而诞生。
在实际上利用时,对相同集合对象的操作并不是唯一的,对同样的成分对象只怕存在多种不相同的操作方法。
而且那几个操作方法并不安定,大概还索要充实新的操作,以满意新的业务供给。
此时,访问者方式就是二个值得考虑的消除方案。
访问者方式的指标是包装一些施加于某种数据结构成分之上的操作,一旦那个操作需求修改的话,接受那几个操作的数据结构能够保险不变。为差别档次的因素提供多种走访操作办法,且能够在不修改原有系统的情状下扩充新的操作形式,那正是访问者情势的情势动机。

在软件系统中,有诸多算法能够兑现某一效应,如搜寻、排序等,一种常用的不二法门是硬编码(Hard
Coding)在三个类中,如必要提供两种寻找算法,能够将那个算法写到三个类中,在此类中提供四个法子,每四个艺术对应二个切实可行的搜索算法;当然也足以将这几个招来算法封装在一个联结的主意中,通过if…else…等标准判断语句来举行抉择。那三种实现格局大家都能够称作硬编码,若是急需增添一种新的探寻算法,需求修改封装算法类的源代码;更换查找算法,也急需修改客户端调用代码。在这一个算法类中封装了大气寻觅算法,该类代码将较复杂,维护相比困难。

在软件系统中,有为数不少算法能够完成某一功力,如搜寻、排序等,一种常用的章程是硬编码(Hard
Coding)在二个类中,如须要提供四种招来算法,能够将那么些算法写到3个类中,在此类中提供多少个点子,每叁个措施对应2个有血有肉的追寻算法;当然也足以将那么些招来算法封装在1个联合的法子中,通过if…else…等标准化判断语句来实行分选。那三种完成方式大家都足以称为硬编码,即使急需扩展一种新的寻找算法,供给修改封装算法类的源代码;更换查找算法,也急需修改客户端调用代码。在那些算法类中封装了多量寻找算法,该类代码将较复杂,维护相比困难。

情势定义
访问者情势(Visitor
Pattern):表示1个效果于某指标组织中的各要素的操作,它使大家得以在不更改各因素的类的前提下定义功用于这个成分的新操作。访问者格局是一种对象行为型情势。
Visitor Pattern: Represent an operation to be performed on the elements
of an object structure. Visitor lets you define a new operation without
changing the classes of the elements on which it operates.
Frequency of use: low
UML图
图片 3

除了提供专门的搜寻算法类之外,还足以在客户端程序中央直机关接包蕴算法代码,那种做法更不可取,将招致客户端程序庞大而且难以有限协理,若是存在大气可供选拔的算法时难点将变得进一步严重。
为了消除那几个标题,能够定义一些独自的类来封装分化的算法,每个类包装一个实际的算法,在此地,每多个包装算法的类我们都足以称呼策略(Strategy),为了保障这一个政策的一致性,一般会用二个虚幻的政策类来做算法的定义,而现实各样算法则对应于1个切实可行策略类。

除此之外提供尤其的检索算法类之外,还足以在客户端程序中央直机关接包涵算法代码,那种做法更不可取,将招致客户端程序庞大而且难以维护,尽管存在大批量可供选用的算法时难题将变得愈加严重。
为了化解那么些题材,能够定义一些单身的类来封装不一样的算法,每3个类包装3个切实可行的算法,在此处,每3个包裹算法的类我们都得以称为策略(Strategy),为了确认保证这个政策的一致性,一般会用三个虚无的政策类来做算法的定义,而具体各类算法则对应于2个切实可行策略类。

情势协会
访问者情势涵盖如下剧中人物:
Vistor: 抽象访问者
ConcreteVisitor: 具体访问者
Element: 抽象成分
ConcreteElement: 具体成分
ObjectStructure: 对象组织

方式定义
方针方式(Strategy
Pattern):定义一文山会海算法,将每二个算法封装起来,并让它们得以相互替换。策略形式让算法独立于选择它的客户而生成,也称之为政策方式(Policy)。策略情势是一种对象行为型形式。
Strategy Pattern: Define a family of algorithms, encapsulate each one,
and make them interchangeable. Strategy lets the algorithm vary
independently from clients that use it.
Frequency of use: medium high
UML图
图片 4

方式定义
策略形式(Strategy
帕特tern):定义一多种算法,将每一个算法封装起来,并让它们得以并行替换。策略格局让算法独立于接纳它的客户而转变,也称为政策方式(Policy)。策略形式是一种对象行为型情势。
Strategy Pattern: Define a family of algorithms, encapsulate each one,
and make them interchangeable. Strategy lets the algorithm vary
independently from clients that use it.
Frequency of use: medium high
UML图
图片 5

形式分析
访问者形式中指标组织存款和储蓄了差别类型的因素对象,以供分裂访问者访问。
访问者形式包涵多少个层次结构,贰个是访问者层次结构,提供了望梅止渴访问者和现实性访问者,四个是因素层次结构,提供了抽象成分和实际因素。
如出一辙的访问者能够以分歧的不二法门访问不一致的因素,相同的因素得以承受分歧访问者以不一致访问形式访问。在访问者情势中,扩充新的访问者无须修改原有系统,系统有着较好的可扩大性。

格局结构
策略情势涵盖如下剧中人物:
Context: 环境类
Strategy: 抽象策略类
ConcreteStrategy: 具体策略类

格局组织
方针方式涵盖如下剧中人物:
Context: 环境类
Strategy: 抽象策略类
ConcreteStrategy: 具体策略类

格局实例与分析
爱人和妇女—访问者格局示例代码
系统布局
图片 6
Vistor: 抽象访问者  Action.cs

格局分析
策略方式是三个比较便于通晓和使用的设计格局,策略格局是对算法的包裹,它把算法的职责和算法自己分割开,委派给不相同的靶子管理。策略方式平日把3个多级的算法封装到一多级的策略类里面,作为一个浮泛策略类的子类。用简单的讲,就是“准备一组算法,并将每四个算法封装起来,使得它们得以沟通”。

方式分析
政策情势是三个比较不难精通和使用的设计格局,策略形式是对算法的卷入,它把算法的义务和算法本人分割开,委派给差异的指标管理。策略形式经常把多少个多重的算法封装到一多重的策略类里面,作为贰个抽象策略类的子类。用简单的说,就是“准备一组算法,并将种种算法封装起来,使得它们得以交流”。

namespace VisitorPattern
{
    abstract class Action
    {
        //得到男人结论或女人反应
        public abstract void GetManConclusion(Man concreateElementA);
        //得到女人结论或男人反应
        public abstract void GetWomanConclusion(Woman concreateElementB);
    }
}

在方针格局中,应当由客户端本人说了算在怎么着情形下接Nash么具体政策剧中人物。
方针方式仅仅封装算法,提供新算法插入到已有种类中,以及老算法从系统中“退休”的福利,策略格局并不控制在哪一天使用何种算法,算法的挑三拣四由客户端来支配。那在自然水准上压实了系统的灵活性,不过客户端供给了解有所具体策略类之间的差距,以便选拔适当的算法,那也是政策情势的老毛病之一,在大势所趋程度上平添了客户端的使用难度。

在方针方式中,应当由客户端本身控制在怎么着状态下行使什么具体策略剧中人物。
策略方式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的有利,策略方式并不控制在哪一天使用何种算法,算法的接纳由客户端来支配。那在必然水平上增强了系统的布帆无恙,可是客户端要求了然有所具体策略类之间的区别,以便选用适宜的算法,那也是政策方式的弱项之一,在早晚程度上平添了客户端的选拔难度。

ConcreteVisitor: 具体访问者 Success.cs

形式实例与分析
市集优惠—策略情势示例代码
系统布局
图片 7
Context: 环境类 CashContext.cs

形式实例与分析
市镇减价—策略格局示例代码
系统布局
图片 8
Context: 环境类 CashContext.cs

using System;

namespace VisitorPattern
{
    //成功
    class Success : Action
    {
        public override void GetManConclusion(Man concreateElementA)
        {
            Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人。", concreateElementA.GetType().Name, this.GetType().Name);
        }

        public override void GetWomanConclusion(Woman concreateElementB)
        {
            Console.WriteLine("{0}{1}时,背后大多有一个不成功的男人。", concreateElementB.GetType().Name, this.GetType().Name);
        }
    }
}
namespace StrategyPattern
{
    class CashContext
    {
        private CashSuper cs;

        //通过构造方法,传入具体的收费策略
        public CashContext(string type)
        {
            switch (type)
            {
                case "正常收费":
                    CashNormal cs0 = new CashNormal();
                    cs = cs0;
                    break;
                case "满300返100":
                    CashReturn cs1 = new CashReturn("300", "100");
                    cs = cs1;
                    break;
                case "打八折":
                    CashRebate cs2 = new CashRebate("0.8");
                    cs = cs2;
                    break;
            }
        }
        public double GetResult(double money)
        {
            //根据收费策略的不同,获得计算结果
            return cs.acceptCash(money);
        }
    }
}
namespace StrategyPattern
{
    class CashContext
    {
        private CashSuper cs;

        //通过构造方法,传入具体的收费策略
        public CashContext(string type)
        {
            switch (type)
            {
                case "正常收费":
                    CashNormal cs0 = new CashNormal();
                    cs = cs0;
                    break;
                case "满300返100":
                    CashReturn cs1 = new CashReturn("300", "100");
                    cs = cs1;
                    break;
                case "打八折":
                    CashRebate cs2 = new CashRebate("0.8");
                    cs = cs2;
                    break;
            }
        }
        public double GetResult(double money)
        {
            //根据收费策略的不同,获得计算结果
            return cs.acceptCash(money);
        }
    }
}

Failing.cs

Strategy: 抽象策略类 CashSuper.cs

Strategy: 抽象策略类 CashSuper.cs

using System;

namespace VisitorPattern
{
    class Failing : Action
    {
        public override void GetManConclusion(Man concreateElementA)
        {
            Console.WriteLine("{0}{1}时,闷头喝酒,谁也不用劝。", concreateElementA.GetType().Name, this.GetType().Name);
        }

        public override void GetWomanConclusion(Woman concreateElementB)
        {
            Console.WriteLine("{0}{1}时,眼泪汪汪,谁也劝不了。", concreateElementB.GetType().Name, this.GetType().Name);
        }
    }
}
namespace StrategyPattern
{
    //现金收费抽象类
    abstract class CashSuper
    {
        public abstract double acceptCash(double money);
    }
}
namespace StrategyPattern
{
    //现金收费抽象类
    abstract class CashSuper
    {
        public abstract double acceptCash(double money);
    }
}

Amativenness.cs

ConcreteStrategy: 具体策略类 CashNormal.cs

ConcreteStrategy: 具体策略类 Cash诺玛l.cs

using System;

namespace VisitorPattern
{
    class Amativenness : Action
    {
        public override void GetManConclusion(Man concreateElementA)
        {
            Console.WriteLine("{0}{1}时,凡事不懂也要装懂。", concreateElementA.GetType().Name, this.GetType().Name);
        }

        public override void GetWomanConclusion(Woman concreateElementB)
        {
            Console.WriteLine("{0}{1}时,遇事懂也装作不懂。", concreateElementB.GetType().Name, this.GetType().Name);
        }
    }
}
namespace StrategyPattern
{
    //正常收费子类
    class CashNormal : CashSuper
    {
        public override double acceptCash(double money)
        {
            return money;
        }
    }
}
namespace StrategyPattern
{
    //正常收费子类
    class CashNormal : CashSuper
    {
        public override double acceptCash(double money)
        {
            return money;
        }
    }
}

Element: 抽象成分 Person.cs

CashRebate.cs

CashRebate.cs

namespace VisitorPattern
{
    abstract class Person
    {
        //接受
        public abstract void Accept(Action visitor);
    }
}
namespace StrategyPattern
{
    //打折收费子类
    class CashRebate : CashSuper
    {
        private double moneyRebate = 1d;
        public CashRebate(string moneyRebate)
        {
            this.moneyRebate = double.Parse(moneyRebate);
        }
        public override double acceptCash(double money)
        {
            return money * moneyRebate;
        }
    }
}
namespace StrategyPattern
{
    //打折收费子类
    class CashRebate : CashSuper
    {
        private double moneyRebate = 1d;
        public CashRebate(string moneyRebate)
        {
            this.moneyRebate = double.Parse(moneyRebate);
        }
        public override double acceptCash(double money)
        {
            return money * moneyRebate;
        }
    }
}

ConcreteElement: 具体成分 Man.cs

CashReturn.cs

CashReturn.cs

using System;

namespace VisitorPattern
{
    class Man : Person
    {
        public override void Accept(Action visitor)
        {
            visitor.GetManConclusion(this);
        }
    }
}
using System;

namespace StrategyPattern
{
    //返利收费子类
    class CashReturn : CashSuper
    {
        private double moneyCondition = 0.0d;
        private double moneyReturn = 0.0d;
        public CashReturn(string moneyCondition, string moneyReturn)
        {
            this.moneyCondition = double.Parse(moneyCondition);
            this.moneyReturn = double.Parse(moneyReturn);
        }
        public override double acceptCash(double money)
        {
            double result = money;
            if (money >= moneyCondition)
                result = money - Math.Floor(money / moneyCondition) * moneyReturn;
            return result;
        }
    }
}
using System;

namespace StrategyPattern
{
    //返利收费子类
    class CashReturn : CashSuper
    {
        private double moneyCondition = 0.0d;
        private double moneyReturn = 0.0d;
        public CashReturn(string moneyCondition, string moneyReturn)
        {
            this.moneyCondition = double.Parse(moneyCondition);
            this.moneyReturn = double.Parse(moneyReturn);
        }
        public override double acceptCash(double money)
        {
            double result = money;
            if (money >= moneyCondition)
                result = money - Math.Floor(money / moneyCondition) * moneyReturn;
            return result;
        }
    }
}

Woman.cs

Client:客户类

Client:客户类

using System;

namespace VisitorPattern
{
    class Woman : Person
    {
        public override void Accept(Action visitor)
        {
            visitor.GetWomanConclusion(this);
        }
    }
}
using System;
using System.Windows.Forms;

namespace StrategyPattern
{
    public partial class Form1 : Form
    {
        //声明一个double变量total来计算总计
        double total = 0.0d;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            CashContext cc = new CashContext(cbxType.SelectedItem.ToString());

            double totalPrices = 0d; ;
            totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));            

            //将每个商品合计计入总计
            total = total + totalPrices;

            lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text + " 合计:" + totalPrices.ToString());
            lblResult.Text = total.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cbxType.Items.AddRange(new object[] { "正常收费", "满300返100", "打八折" });
            cbxType.SelectedIndex = 0;
        }
    }
}
using System;
using System.Windows.Forms;

namespace StrategyPattern
{
    public partial class Form1 : Form
    {
        //声明一个double变量total来计算总计
        double total = 0.0d;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            CashContext cc = new CashContext(cbxType.SelectedItem.ToString());

            double totalPrices = 0d; ;
            totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));            

            //将每个商品合计计入总计
            total = total + totalPrices;

            lbxList.Items.Add("单价:" + txtPrice.Text + "数量:" + txtNum.Text + " 合计:" + totalPrices.ToString());
            lblResult.Text = total.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cbxType.Items.AddRange(new object[] { "正常收费", "满300返100", "打八折" });
            cbxType.SelectedIndex = 0;
        }
    }
}

ObjectStructure: 对象组织 ObjectStructure.cs

格局优缺点
方针方式的长处

策略形式提供了对“开闭原则”的一应俱全帮助,用户能够在不修改原有系统的根基上摘取算法或作为,也足以灵活地充实新的算法或行为。
 策略格局提供了管制相关的算法族的主意。
 策略格局提供了足以替换继承关系的措施。
 使用政策情势能够免止选拔多重规范转移语句。

模式优缺点
方针情势的长处

策略情势提供了对“开闭原则”的通盘协助,用户能够在不修改原有系统的基础上摘取算法或作为,也足以灵活地充实新的算法或作为。
 策略情势提供了管制相关的算法族的办法。
 策略方式提供了足以替换继承关系的法门。
 使用政策格局能够幸免采纳多重原则转移语句。

using System.Collections.Generic;

namespace VisitorPattern
{
    //对象结构
    class ObjectStructure
    {
        private IList<Person> elements = new List<Person>();
        //增加
        public void Attach(Person element)
        {
            elements.Add(element);
        }
        //移除
        public void Detach(Person element)
        {
            elements.Remove(element);
        }
        //查看显示
        public void Display(Action visitor)
        {
            foreach (Person e in elements)
            {
                e.Accept(visitor);
            }
        }
    }
}

策略格局的老毛病
 客户端必须掌握全部的策略类,并自行决定使用哪多个策略类。

策略形式将招致生出很多策略类,能够透过利用享元形式在一定水平上压缩对象的多少。

策略格局的败笔
 客户端必须知道全体的策略类,并自行决定使用哪三个策略类。

策略格局将招致生出不少策略类,可以透过利用享元形式在放任自流程度上压缩对象的数量。

Client:客户类

形式适用条件
在偏下情况下得以行使政策方式:

如若在三个种类里面有那个类,它们中间的界别仅在于它们的表现,那么使用政策格局能够动态地让贰个对象在诸多行事中选用一种行为。
 1个系统须求动态地在两种算法中甄选一种。

就算三个目标有许多的一坐一起,假诺不用适当的形式,那么些行为就只可以动用多重的准绳选拔语句来促成。

不期待客户端知道复杂的、与算法相关的数据结构,在切实政策类中封装算法和相关的数据结构,提升算法的保密性与安全性。

方式适用条件
在以下意况下能够动用政策方式:

倘若在2个系统内部有不少类,它们之间的分别仅在于它们的表现,那么使用政策格局能够动态地让贰个对象在重重作为中精选一种表现。
 多少个系统需求动态地在两种算法中选用一种。

要是一个对象有很多的表现,要是不用方便的形式,那个表现就不得不选用多重的规格选用语句来促成。

不期望客户端知道复杂的、与算法相关的数据结构,在实际政策类中封装算法和血脉相通的数据结构,进步算法的保密性与安全性。

using System;

namespace VisitorPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectStructure o = new ObjectStructure();
            o.Attach(new Man());
            o.Attach(new Woman());
            //成功时的反应
            Success v1 = new Success();
            o.Display(v1);
            //失败时的反应
            Failing v2 = new Failing();
            o.Display(v2);
            //恋爱时的反应
            Amativenness v3 = new Amativenness();
            o.Display(v3);
            Console.Read();
        }
    }
}

【注明与多谢】
本文,站在重重高个子的双肩上,借鉴和引用了诸多外人拥有版权的著述或撰文,在此,对前人们的孝敬致谢。并同时透露引用的剧情、原来的著作者或缘于(一些起点互连网的剧情作者不能追述本源,深表遗憾)。

【申明与感激】
本文,站在重重高个子的肩头上,借鉴和引用了累累外人拥有版权的小说或撰文,在此,对前人们的进献致谢。并还要公布引用的始末、最初的著小编或缘于(一些来自互连网的内容笔者不能够追述本源,深表遗憾)。

格局优缺点
访问者方式的帮助和益处
 使得扩展新的拜访操作变得很不难。

将关于因素对象的访问行为集中到四个访问者对象中,而不是分散到3个个的因素类中。
 能够跨过类的等级结构访问属于差异的级差结构的成分类。
 让用户能够在不改动现有类层次结构的气象下,定义该类层次结构的操作。
访问者情势的败笔

扩展新的要素类很不便。在访问者形式中,每扩张2个新的因素类都表示要在空虚访问者角色中追加三个新的用空想来欺骗别人操作,并在每3个切实可行访问者类中加进对应的具体操作,违背了“开闭原则”的要求。

破坏封装。访问者情势必要访问者对象访问并调用每七个因素对象的操作,那意味成分对象有时候必须揭发一些谈得来的内部操作和在那之中境况,不然无法供访问者访问。

【参考文献】
《设计形式—可复用面向对象软件的基本功》小编: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改进既有代码的统一筹划》小编: Martin 福勒译者:候捷
中华夏族民共和国电力出版社
《敏捷软件开发—原则、格局与执行》小编: 罗Bert C. 马丁 南开东军事和政院学出版社
《程序员修炼之道—从小工到我们》小编: Andrew Hunt / 大卫 托马斯电子工业出版社
《Head First 设计形式》小编: Freeman 译者: O’Reilly Taiwan公司中夏族民共和国电力出版社
《设计格局之禅》 作者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计方式纵横谈》 教授:李建忠
刘伟先生. 设计情势. 日本东京:哈工业余大学学东军事和政院学出版社, 二零一二.
刘伟同志. 设计情势实验和培养和陶冶教程. 北京:南开东军政高校学出版社, 二零一一.
《大话设计方式》 小编: 程杰 复旦东军大学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮电出版社
《你不能够不知道的.NET》小编: 王涛
《项目中的.NET》作者: 李天平 电子工业出版社
《Microsoft .NET集团级应用架构设计》笔者: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客我:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客笔者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客作者:Allen lee
http://blog.csdn.net/ai92 博客我:ai92
http://www.cnblogs.com/umlonline/ 博客作者:张传波
http://www.cnblogs.com/lovecherry/ 博客小编:LoveCherry

【参考文献】
《设计形式—可复用面向对象软件的基础》作者: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改良既有代码的安插》笔者: 马丁 Fowler译者:候捷
中中原人民共和国电力出版社
《敏捷软件开发—原则、形式与实践》小编: 罗Bert C. 马丁 哈工业余大学学东军政高校学出版社
《程序员修炼之道—从小工到大家》小编: Andrew Hunt / 大卫 托马斯电子工业出版社
《Head First 设计形式》笔者: 弗里曼 译者: O’Reilly Taiwan公司中中原人民共和国电力出版社
《设计方式之禅》 作者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计模式纵横谈》 教师:李建忠
刘伟同志. 设计情势. 法国巴黎:南开东军事和政院学出版社, 2013.
刘伟同志. 设计情势实验和培养和磨炼教程. 新加坡:浙大大学出版社, 2011.
《大话设计方式》 笔者: 程杰 南开东军事和政院学出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮电出版社
《你不能够不精通的.NET》笔者: 王涛
《项目中的.NET》小编: 李天平 电子工业出版社
《Microsoft .NET集团级应用架构划设想计》笔者: (美)埃斯波西托等撰写 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
http://www.cnblogs.com/terrylee 博客小编:李会军
http://www.cnblogs.com/anlyren/ 博客小编:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客小编:Allen lee
http://blog.csdn.net/ai92 博客我:ai92
http://www.cnblogs.com/umlonline/ 博客小编:张传波
http://www.cnblogs.com/lovecherry/ 博客笔者:LoveCherry

情势适用条件
在以下情状下得以行使访问者情势:

三个目的组织包罗众多类别的指标,希望对那么些指标执行部分借助其具体品种的操作。在访问者中针对每种具体的类型都提供了二个做客操作,不一致类型的目的能够有例外的访问操作。

须要对三个目的组织中的对象开始展览过多见仁见智的同时不相干的操作,而急需幸免让这几个操作“污染”那几个目的的类,也不希望在增多新操作时修改这么些类。访问者格局使得大家能够将相关的拜会操作集中起来定义在访问者类中,对象协会能够被几个不等的访问者类所使用,将目的自笔者与目的的访问操作分离。
 对象组织中指标对应的类很少改变,但每每索要在此目的社团上定义新的操作。

 

【表明与谢谢】
正文,站在诸多高个子的肩头上,借鉴和引用了不少旁人拥有版权的创作或撰文,在此,对前人们的贡献致谢。并同时发表引用的始末、原文者或出自(一些源点网络的内容本人不能追述本源,深表遗憾)。

【参考文献】
《设计形式—可复用面向对象软件的功底》我: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改进既有代码的设计》作者: Martin Fowler译者:候捷
中华夏族民共和国电力出版社
《敏捷软件开发—原则、情势与实施》小编: 罗Bert C. 马丁 浙大东军事和政治高校学出版社
《程序员修炼之道—从小工到大方》小编: 安德鲁 Hunt / 戴维 Thomas电子工业出版社
《Head First 设计情势》作者: Freeman 译者: O’Reilly Taiwan公司中中原人民共和国电力出版社
《设计格局之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计方式纵横谈》 助教:李建忠
Liu Wei. 设计形式. 新加坡:哈工大东军事和政院学出版社, 二〇一三.
刘伟(Liu-Wei). 设计方式实验和培养和练习教程. 香港:哈工大东军事和政院学出版社, 二〇一三.
《大话设计情势》 我: 程杰 清华出版社
《C#图解教程》小编: 索Liss 译者: 苏林 / 朱晔 人民邮政和邮电通讯出版社
《你无法不精通的.NET》笔者: 王涛
《项目中的.NET》我: 李天平 电子工业出版社
《Microsoft .NET公司级应用架构划设想计》笔者: (美)埃斯波西托等作品 译者:
陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客小编:吕震宇
http://www.cnblogs.com/terrylee 博客作者:李会军
http://www.cnblogs.com/anlyren/ 博客笔者:anlyren
http://www.cnblogs.com/idior 博客小编:idior
http://www.cnblogs.com/allenlooplee 博客笔者:Allen lee
http://blog.csdn.net/ai92 博客我:ai92
http://www.cnblogs.com/umlonline/ 博客小编:张传波
http://www.cnblogs.com/lovecherry/ 博客笔者:乐福Cherry 

相关文章