首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >战略与代表

战略与代表
EN

Software Engineering用户
提问于 2012-07-05 11:33:42
回答 2查看 3.6K关注 0票数 4

Strategy设计模式能完全取代delegates吗?

例如,在Java中,没有委托。使用delegates设计模式可以获得Strategy的所有特性吗?

编辑:我发现我的问题有些含糊不清。delegates指的是该语言的特性,例如C#。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2012-07-05 12:21:03

是否有可能通过使用策略设计模式来获得代表的所有特征?

不完全同意。

在C#中,委托用于很好地实现策略模式。有时,通过继承的虚拟调度被用来实现策略模式,因为它更适合这个问题。很少使用过载动态方法。

Java现在只有第二个选项。

说策略模式可以提供委托行为是不正确的,因为其中一个是设计模式,另一个是构造。整个图灵完整性说,Java可以模仿委托行为,但是委托的许多特性(捕获局部变量、多重转换)将超出策略模式解决的范围。

票数 3
EN

Software Engineering用户

发布于 2012-07-05 14:07:53

委托只是一个没有数据和一个方法的类。这在几乎所有的OO语言中都很容易实现,甚至包括C#,当然还有Java。

C# (使用委托):

代码语言:javascript
运行
复制
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 ))  {
    ...
}

爪哇:

代码语言:javascript
运行
复制
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#中这样做是留给读者的练习。

票数 12
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/155705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档