本来也能够将那几个招来算法封装在三个联结的不二法门中,大家能够根据环境依然条件的两样选用不一致的策略来完结该项任务

情势动机
图片 1

方式动机
图片 2

情势动机

完结一项职务,往往能够有各样差异的格局,每一个方法叫做2个政策,我们能够根据条件依旧规格的不等选用区其余国策来成功该项职责。
在软件开发中也平日碰着类似的场所,完结某贰个效应有三个途径,此时得以行使一种设计格局来驱动系统能够灵活地挑选化解途径,也能够有利于地追加新的缓解途径。

形成一项任务,往往能够有多样差异的章程,各个办法叫做3个国策,大家能够依照环境照旧规格的两样选用差其他政策来成功该项职责。
在软件开发中也时不时蒙受类似的情形,完毕某1个效能有三个路子,此时得以选择一种设计格局来驱动系统能够灵活地挑选化解途径,也能够有利于地扩展新的缓解途径。

对此系统中的有个别对象,它们存款和储蓄在同1个聚众中,且全体差其余门类,而且对于该集合中的目的,能够承受一类称为访问者的靶子来拜访,而且分歧的访问者其访问方式有所分化,访问者方式为赶尽杀绝那类难题而诞生。
在事实上使用时,对相同集合对象的操作并不是绝无仅有的,对同样的要素对象可能存在各样差异的操作格局。
还要那几个操作方法并不安定,可能还索要充实新的操作,以满意新的工作要求。
那会儿,访问者情势正是三个值得考虑的消除方案。
访问者情势的指标是包裹一些施加于某种数据结构成分之上的操作,一旦这么些操作要求修改的话,接受这些操作的数据结构能够保持不变。为不相同档次的因素提供二种访问操作办法,且能够在不改动原有系统的意况下扩展新的操作方法,那正是访问者情势的格局动机。

在软件系统中,有许多算法能够达成某一功力,如搜寻、排序等,一种常用的措施是硬编码(Hard
Coding)在1个类中,如必要提供各样物色算法,能够将这几个算法写到三个类中,在此类中提供多少个形式,每七个方法对应三个实际的寻找算法;当然也得以将那个招来算法封装在三个集合的办法中,通过if…else…等原则判断语句来展开分选。那二种实现方式大家都得以称之为硬编码,借使急需追加一种新的物色算法,必要修改封装算法类的源代码;更换查找算法,也亟需修改客户端调用代码。在这么些算法类中封装了汪洋查找算法,该类代码将较复杂,维护相比较困难。

在软件系统中,有好多算法能够兑现某一成效,如搜寻、排序等,一种常用的法子是硬编码(Hard
Coding)在一个类中,如须要提供各个搜索算法,能够将那些算法写到二个类中,在此类中提供多少个形式,每三个主意对应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

除却提供特其余搜寻算法类之外,还能在客户端程序中央直机关接包罗算法代码,这种做法更不可取,将导致客户端程序庞大而且难以有限支撑,如若存在大气可供选拔的算法时难题将变得尤其严重。
为了缓解那一个题材,能够定义一些独门的类来封装不相同的算法,每一个类包装贰个切实可行的算法,在那边,每2个装进算法的类大家都能够称作策略(Strategy),为了保障那些策略的一致性,一般会用1个浮泛的国策类来做算法的概念,而实际各样算法则对应于一个有血有肉策略类。

除外提供专门的寻找算法类之外,还是能在客户端程序中央直机关接包蕴算法代码,那种做法更不可取,将造成客户端程序庞大而且难以保险,固然存在大气可供选拔的算法时难点将变得特别严重。
为了缓解那些难题,能够定义一些单身的类来封装分化的算法,每3个类包装二个有血有肉的算法,在此处,每一种装进算法的类大家都足以叫做策略(Strategy),为了保证那个政策的一致性,一般会用一个抽象的策略类来做算法的定义,而具体各样算法则对应于3个具体策略类。

情势结构
访问者情势涵盖如下角色:
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

方式分析
访问者形式中目的组织存款和储蓄了区别门类的因素对象,以供不一样访问者访问。
访问者格局包含七个层次结构,3个是访问者层次结构,提供了望梅止渴访问者和现实性访问者,多少个是因素层次结构,提供了抽象成分和现实因素。
同等的访问者可以以不一样的章程访问分化的因素,相同的因素得以接受不一致访问者以分化访问格局访问。在访问者格局中,扩充新的访问者无须修改原有系统,系统具有较好的可扩充性。

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

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

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

格局分析
策略情势是二个比较不难明白和利用的设计方式,策略格局是对算法的包裹,它把算法的义务和算法本人分割开,委派给不一致的靶子管理。策略情势经常把3个多级的算法封装到一多级的策略类里面,作为三个虚幻策略类的子类。用一言以蔽之,正是“准备一组算法,并将每贰个算法封装起来,使得它们得以交流”。

情势分析
方针模式是三个比较易于领悟和利用的设计情势,策略格局是对算法的包装,它把算法的职分和算法自己分割开,委派给分裂的对象管理。策略形式平常把一个名目繁多的算法封装到一名目繁多的策略类里面,作为3个华而不实策略类的子类。用简单来说,就是“准备一组算法,并将每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: 具体策略类 CashNormal.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);
            }
        }
    }
}

策略情势的通病
 客户端必须掌握全部的策略类,并自行决定使用哪1个策略类。

策略情势将造成生出很多策略类,可以通过使用享元情势在一定水平上减弱对象的数额。

方针情势的瑕疵
 客户端必须掌握全数的策略类,并自行决定使用哪八个策略类。

策略格局将招致生出很多策略类,能够透过利用享元方式在必然水准上压缩对象的数据。

Client:客户类

方式适用条件
在偏下意况下得以选择政策格局:

假使在一个种类之中有很多类,它们中间的区分仅在于它们的一颦一笑,那么使用政策形式能够动态地让1个对象在众多表现中挑选一种表现。
 3个系统须要动态地在两种算法中选拔一种。

假诺3个指标有那个的表现,要是不用合适的格局,那一个作为就只可以动用多重的尺度选取语句来完结。

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

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

若是在1个体系内部有成都百货上千类,它们中间的分别仅在于它们的一举一动,那么使用政策情势能够动态地让一个对象在诸多作为中挑选一种表现。
 八个类别须求动态地在两种算法中采用一种。

假如三个指标有过多的表现,假诺不用方便的情势,这一个作为就不得不采用多重的口径选用语句来兑现。

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

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();
        }
    }
}

【表明与感激】
本文,站在众多高个儿的肩膀上,借鉴和引用了成都百货上千客人拥有版权的文章或撰文,在此,对前人们的孝敬致谢。并还要公布引用的情节、原小编或缘于(一些源于互连网的剧情作者没办法追述本源,深表遗憾)。

【证明与感激】
本文,站在很多高个儿的肩头上,借鉴和引用了不少客人拥有版权的文章或撰文,在此,对前人们的进献致谢。并还要发表引用的剧情、原小编或缘于(一些源于网络的始末作者不能追述本源,深表遗憾)。

方式优缺点
访问者方式的优点
 使得扩张新的拜会操作变得很简单。

将有关因素对象的访问行为集中到二个访问者对象中,而不是分散到1个个的成分类中。
 能够跨过类的阶段结构访问属于不相同的等级结构的成分类。
 让用户可以在不修改现有类层次结构的情状下,定义该类层次结构的操作。
访问者形式的败笔

扩大新的因素类很劳累。在访问者方式中,每扩大2个新的成分类都意味要在架空访问者剧中人物中扩展一个新的虚幻操作,并在每多少个有血有肉访问者类中追加对应的具体操作,违背了“开闭原则”的供给。

破坏封装。访问者形式要求访问者对象访问并调用每三个元素对象的操作,那象征成分对象有时候必须暴露一些团结的内部操作和在这之中景况,不然不能供访问者访问。

【参考文献】
《设计情势—可复用面向对象软件的底蕴》小编: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改良既有代码的布置性》小编: 马丁 Fowler译者:候捷
中夏族民共和国电力出版社
《敏捷软件开发—原则、情势与实践》小编: 罗Bert C. 马丁 浙大东军事和政院学出版社
《程序员修炼之道—从小工到学者》小编: Andrew Hunt / 大卫 托马斯电子工业出版社
《Head First 设计方式》作者: Freeman 译者: O’Reilly Taiwan集团中中原人民共和国电力出版社
《设计格局之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计情势纵横谈》 助教:李建忠
Liu Wei. 设计方式. Hong Kong:南开大学出版社, 2012.
刘伟同志. 设计格局实验和培养和磨炼教程. 香岛:清华大学出版社, 二零一二.
《大话设计方式》 笔者: 程杰 清华高校出版社
《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译者:候捷
中夏族民共和国电力出版社
《敏捷软件开发—原则、情势与执行》小编: Robert C. Martin 武大东军事和政院学出版社
《程序员修炼之道—从小工到大方》作者: Andrew Hunt / 大卫 Thomas电子工业出版社
《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 博客作者:阿伦 lee
http://blog.csdn.net/ai92 博客小编:ai92
http://www.cnblogs.com/umlonline/ 博客作者:张传波
http://www.cnblogs.com/lovecherry/ 博客小编:乐福Cherry

格局适用条件
在偏下景况下得以行使访问者情势:

2个目的组织包涵众多品类的靶子,希望对这个指标实香港行政局地凭借其实际项指标操作。在访问者中针对各样具体的档次都提供了一个走访操作,差别品种的对象足以有两样的访问操作。

须求对3个对象组织中的对象举行过多例外的还要不相干的操作,而急需制止让那些操作“污染”那么些目的的类,也不希望在增多新操作时修改这么些类。访问者情势使得大家能够将有关的拜会操作集中起来定义在访问者类中,对象组织能够被多少个例外的访问者类所使用,将指标自笔者与指标的访问操作分离。
 对象组织中目的对应的类很少改变,但每每索要在此目的组织上定义新的操作。

 

【申明与谢谢】
正文,站在广大大汉的肩头上,借鉴和引用了累累客人拥有版权的著述或撰文,在此,对前人们的贡献致谢。并还要发表引用的情节、原我或出自(一些来源于网络的始末本人不可能追述本源,深表遗憾)。

【参考文献】
《设计格局—可复用面向对象软件的根基》小编: [美] 埃里克h Gamma / RichardHelm / 拉尔夫 Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 /
刘建中 等 机械工业出版社
《重构—改革既有代码的规划》作者: 马丁 Fowler译者:候捷
中国电力出版社
《敏捷软件开发—原则、形式与实践》笔者: Robert C. 马丁 北大东军大学出版社
《程序员修炼之道—从小工到大方》小编: Andrew Hunt / 大卫 托马斯电子工业出版社
《Head First 设计格局》作者: Freeman 译者: O’Reilly Taiwan集团中夏族民共和国电力出版社
《设计格局之禅》 小编: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计格局纵横谈》 教师:李建忠
刘伟同志. 设计格局. 东京:浙大东军大学出版社, 二〇一二.
刘伟(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/ 博客我:Love切莉 

相关文章