Strategy模式是对算法的封装。即使是一个计算行为,如果其实现有其多样性,为达到易扩展的目的,我们也有必要将其抽象出来,以接口的形式来定义。由于充分利用了面向 对象的多态性,在调用该行为时,其具体的实现是在运行期决定的。以税收计算为例,假定税收策略分为个人所得税,和企业所得税。根据策略模式,将税收策略抽象为接口ITaxStrategy:
public interface ITaxStrategy
{
double Calculate(double income);
}
各种税收策略均实现该类:
public class PeronalTaxStrategy:ITaxStrategy
{
public double Calculate(double income)
{
//实现;
}
}
public class EnterpriseTaxStrategy:ITaxStrategy
{
public double Calculate(double income)
{
//实现;
}
}
如果此时有一个公共的类,提供税收的相关操作,其中就包括计算所得税的方法:
public class TaxOp
{
private ITaxStrategy strategy;
public TaxOp(ITaxStrategy strategy)
{
this.strategy = strategy;
}
public double GetTax(double income)
{
return strategy.Calculate(income);
}
}
客户端调用:
public class App
{
public static void Main(string[] args)
{
TaxOp op = new TaxOp(new PersonalTaxStrategy());
Console.WriteLine("The Personal Tax is :{0}", op.GetTax(1000));
}
}
这是一种典型的面向对象的设计思路。然而,对于一些简单的算法行为,我们也可以利用delegate委托的方式,来实现以上的设计,它虽然更近似于面向过程的设计,但其扩展性同样灵活。如果算法的逻辑不复杂,且算法的实现处于某种待定的状态,也许使用委托会比Strategy模式更方便。
我们同样利用上述的例子,只是将原来抽象出来的接口修改为委托:
public delegate double CalculateTax(double income);
对于个人所得税和企业所得税的实现,相应修改为:
public class Tax
{
public static double CalculatePersonalTax(double income)
{
//实现;
}
public static double CalculateEnterpriseTax(double income)
{
//实现;
}
}
税收的公共类则修改如下:
public class TaxOp
{
private CalculateTax calDel;
public TaxOp(CalculateTax calDel)
{
this.calDel = calDel;
}
public double GetTax(double income)
{
return calDel(income);
}
}
客户端的调用:
public class App
{
public static void Main(string[] args)
{
TaxOp op = new TaxOp(new CalculateTax(Tax.CalculatePersonalTax));
Console.WriteLine("The Personal Tax is :{0}", op.GetTax(1000));
}
}
从这两个实现方案来看,代码是大同小异的,但设计思想则迥然不同。它是面向对象和面向过程的区别,前者是将行为封装为对象,而后者则直接对方法进行操作,同时又利用delegate委托来实现扩展。个人意见,我还是倾向于第一种方案,但后者至少也提供了一种思路。尤有甚者,我们也可以将委托理解为一种特殊的抽象,因为其本质是函数指针,它代表了一簇函数,从而对具有相同特性的行为进行了普遍意义的抽象。也许,这样可以促进对委托的理解。
分享到:
相关推荐
除了事件处理,委托还可以用于实现策略模式或命令模式,通过在运行时动态决定执行哪个方法,增加代码的灵活性。例如,我们可以创建一个通用方法,接收一个委托作为参数,然后在需要时调用它: ```csharp public void...
而委托(Delegate)和事件(Event)机制则天然契合观察者模式,使得异步编程和响应式设计更为便捷。 此外,这本书可能还会涵盖一些现代设计原则和实践,如SOLID原则(单一职责原则、开闭原则、里氏替换原则、接口...
比如,C#的事件(Event)机制与观察者模式完美契合,而委托(Delegate)则与策略模式相辅相成。 五、实例讲解 在学习设计模式时,实例是最有效的教学工具。通过实际编写和分析C#代码,可以加深对模式的理解,比如...
此外,随着C#语言的不断进化,诸如async/await异步编程模式、委托(Delegate)和事件(Event)等也使得设计模式的应用更为简便和高效。 本书将详细解析每一种设计模式的概念、意图、结构、参与者、实现方式以及优...
在C#中,设计模式的实现往往涉及到面向对象编程的特性,如接口(Interface)、抽象类(Abstract Class)、委托(Delegate)以及泛型(Generic)。例如,单例模式通常利用静态成员和私有构造函数来确保类只有一个实例...
例如,使用`static`关键字实现单例模式,利用`interface`和`abstract class`实现工厂模式,使用`event`和`delegate`实现观察者模式等。熟练掌握这些设计模式,不仅能够提升代码质量,还能提高团队之间的沟通效率,...
C#作为.NET框架的一部分,支持更高级的语言特性,如接口(Interface)和委托(Delegate),这使得实现如事件驱动的观察者模式更为便捷。 在《精典设计模式》的CHM文件中,你可能会找到以下一些设计模式的详细解释:...
此外,委托模式(Delegate)在QTableView等控件中用于定制数据的显示和编辑行为,使得用户界面更加灵活和个性化。 再者,部分可能涵盖的高级主题包括策略模式(Strategy),在Qt中可以用于动态切换不同的算法或行为...
C#作为.NET框架的主要编程语言,支持丰富的面向对象特性,如接口(Interface)、抽象类(Abstract Class)和委托(Delegate),这使得在C#中实现设计模式更加自然和高效。例如,工厂方法模式可以利用C#的虚方法和...
此外,C#语言特性,如接口(Interface)、抽象类(Abstract Class)和委托(Delegate),为实现这些模式提供了坚实的基础。 设计模式不仅提升了代码的可读性和可维护性,还促进了团队间的沟通。理解并熟练运用设计...
在C#中,设计模式的实现通常结合了语言特性,如接口(Interface)、抽象类(Abstract Class)、委托(Delegate)和事件(Event)。例如,策略模式利用接口实现算法的动态选择,而观察者模式则可以通过事件和委托来...
3. **代理模式** (Delegate): iOS中的委托模式是实现组件间通信的重要手段,如UITableView的DataSource和Delegate。通过遵循协议,一个对象可以通知另一个对象其状态改变或请求服务,而无需两者之间有直接的依赖关系...
此外,C#的委托(delegate)和事件(event)机制完美地支持了观察者模式,使得对象间能订阅和发布事件。同时,C#的动态类型(dynamic)和泛型(generic)特性为其他模式如策略模式和装饰器模式提供了强大的支持。 ...
- **策略模式(Strategy)**:定义一组可互相替换的算法,并使它们都可以在相同的接口下工作。C#中的`委托`和`Lambda表达式`可以方便地实现策略模式。 - **模板方法模式(Template Method)**:定义一个操作中的...
例如,接口(Interface)和抽象类(Abstract Class)在实现多态性和封装性方面起到了关键作用,而委托(Delegate)和事件(Event)则支持了观察者模式,Lambda表达式简化了策略模式的实现,匿名方法和闭包则与迭代器...
VB.NET中的设计模式实现通常会结合.NET框架的特性,例如使用接口(Interface)来定义行为规范,使用委托(Delegate)和事件(Event)来实现观察者模式,使用泛型(Generic)来提高代码的灵活性和复用性。此外,VB...
委托也可用来实现策略(Strategy)[GoF,p.315]和状态(State)[GoF,p.305]模式。现在,我来说明一个事实,委托和成员函数指针相比并不仅仅是好用,而且比成员函数指针简单得多!既然所有的.NET语言都实现了委托,你...
C#中的委托(`Delegate`)和事件(`Event`)机制是命令模式的应用。 16. **解释器模式(Interpreter)**:给定一个语言,定义其文法的一种表示,并且给出一个解释器,这个解释器用于给定表示的实例解释语言中的句子...
- **策略模式(Strategy)**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用它的客户。 - **模板方法模式(Template Method)**:在一个方法中定义一个算法的...
7. **多播委托模式(Multicast Delegate Pattern)**(16-multicast-delegate-pattern) 多播委托模式解决了Objective-C单播委托的局限,允许多个接收者监听同一事件。在iOS中,多播委托可以用于在一个事件发生时...