Strategy设计模式能完全取代delegates吗?
例如,在Java中,没有委托。使用delegates设计模式可以获得Strategy的所有特性吗?
编辑:我发现我的问题有些含糊不清。delegates指的是该语言的特性,例如C#。
发布于 2012-07-05 12:21:03
是否有可能通过使用策略设计模式来获得代表的所有特征?
不完全同意。
在C#中,委托用于很好地实现策略模式。有时,通过继承的虚拟调度被用来实现策略模式,因为它更适合这个问题。很少使用过载动态方法。
Java现在只有第二个选项。
说策略模式可以提供委托行为是不正确的,因为其中一个是设计模式,另一个是构造。整个图灵完整性说,Java可以模仿委托行为,但是委托的许多特性(捕获局部变量、多重转换)将超出策略模式解决的范围。
发布于 2012-07-05 14:07:53
委托只是一个没有数据和一个方法的类。这在几乎所有的OO语言中都很容易实现,甚至包括C#,当然还有Java。
C# (使用委托):
public delegate bool Test( int, int );
// And in some other class/method:
SortEm.sort( ilist, (a, b) => a < b );
// And in static class SortEm:
public static void sort( int[] list, Test test ) {
...
if (test( x, y )) {
...
}爪哇:
public interface JDelegate {
public boolean test( int a, int b );
}
// And in some other class/method:
SortEm.sort( ilist,
// Anonymous Class
new JDelegate() {
@Override public boolean test( int a, int b ) { return a < b; }
}
);
// And in class SortEm:
public static void sort( int[] list, JDelegate sorter ) {
...
if (sorter.test( x, y )) {
...
}Java需要更多的输入。它确实使用了现有的概念,而不是创建新的概念(例如委托),这使得当您在C上花了一年时间回到Java时更容易。此外,如果需要的话," JDelegate“接口可以变得更加精细,就像类实际传递的那样,这个类可以是一个实现JDelegate的命名类(而不是匿名类)。
这段代码中最常用的C#边是对排序的调用--在本例中是一行对四行。但是在Java和任何OO语言中都有它的功能。
在没有委托的情况下在C#中这样做是留给读者的练习。
https://softwareengineering.stackexchange.com/questions/155705
复制相似问题