1

在 C# 中,我使用带有字典的策略模式,如下所示:

namespace NowListeningParserTool.Classes
{
using System.Collections.Generic;

public class WebsiteDictionary
{
    private readonly Dictionary<string, WebsiteParser> _website = new Dictionary<string, WebsiteParser>();

    public WebsiteDictionary()
    {
        _website.Add("YouTube", new YoutubeWebsiteParser());
        _website.Add("977 Music", new NineNineSevenMusicWebsiteParser());
        _website.Add("Grooveshark", new GroovesharkWebsiteParser());
        _website.Add("Sky.FM", new SkyfmWebsiteParser());
        _website.Add("iHeart", new IheartWebsiteParser());
        _website.Add("Live365", new LiveThreeSixFiveWebsiteParser());
        _website.Add("Pandora", new PandoraWebsiteParser());
        _website.Add("Spotify", new SpotifyWebsiteParser());
    }

    public string GetArtistAndTitle(string website, string browser, string stringToParse)
    {
        return _website[website].GetArtistAndTitle(browser, stringToParse, website);
    }

    public string GetWebsiteLogoUri(string website)
    {
        return _website[website].WebsiteLogoUri;
    }
}
}

WebsiteParser 是抽象类。

在 JavaScript 中这个的语法是什么?例如,我在 JavaScript 中有多个 IF 语句:

function getWebsite() {
    if (document.URL.indexOf('grooveshark.com') >= 0) return getTrackGrooveshark();
    if (document.URL.indexOf('977music.com') >= 0) return getTrack977Music();
    if (document.URL.indexOf('sky.fm/play') >= 0) return getTrackSkyFm();
    if (document.URL.indexOf('iheart.com') >= 0) return getTrackIHeart();
    if (document.URL.indexOf('live365.com') >= 0) return getTrackLive365();
    if (document.URL.indexOf('youtube.com') >= 0) return getTrackYoutube();
    if (document.URL.indexOf('pandora.com') >= 0) return getTrackPandora();
    if (document.URL.indexOf('spotify.com') >= 0) return getTrackSpotify();
}

...我真的不喜欢,并且想使用与 C# 中相同的方法来消除这些丑陋的 IF。

干杯。

4

3 回答 3

3

也许是这样的,但我没有足够的细节来知道这种方法是否适合你。但是,它展示了如何将对象用作键/值存储。

var fetchingStrategies = {
    'grooveshark.com': function () {
        return 'grooving!';
    },
    'youtube.com': function () {
        return 'youtubing!';
    }
};

//execute fetching strategy based on domain
fetchingStrategies['youtube.com']();

显然,您可以将硬编码的“youtube.com”字符串替换为保存正确域以进行查找的变量。

于 2013-09-03T23:59:49.620 回答
1

选项 1:从执行的函数返回内容。

function getWebsite() {
    var websites = [
            ['grooveshark.com',getTrackGrooveshark],
            ['977music.com',getTrack977Music],
            ['sky.fm/play',getTrackSkyFm],
            ['iheart.com',getTrackIHeart],
            ['live365.com',getTrackLive365],
            ['youtube.com',getTrackYoutube],
            ['pandora.com',getTrackPandora],
            ['spotify.com',getTrackSpotify]
        ],
        url = document.URL,
        ret;
    $.each(websites,function(i,v){
        if(url.indexOf(v[0]) !== -1){
           ret = v[1]();
           return false;
        }
    });
    return ret;
}

选项 2:调用函数.. 不返回任何内容

function getWebsite() {
    var websites = [
            ['grooveshark.com',getTrackGrooveshark],
            ['977music.com',getTrack977Music],
            ['sky.fm/play',getTrackSkyFm],
            ['iheart.com',getTrackIHeart],
            ['live365.com',getTrackLive365],
            ['youtube.com',getTrackYoutube],
            ['pandora.com',getTrackPandora],
            ['spotify.com',getTrackSpotify]
        ],
        url = document.URL;

    $.each(websites,function(i,v){
        if(url.indexOf(v[0]) !== -1){
           v[1](); //Executes the function
           return false; //Breaks the Each loop.
        }
    });
}
于 2013-09-03T23:58:25.380 回答
0

我认为这实际上是使用简单的 JavaScript 对象的问题。基本上,您可以以与在 C# 中类似的方式引用对象的任何属性,但我认为以更简单的方式。当然这是我的意见 :) 我喜欢以自我实例化的方式来构建我的模块,比如 jQuery,所以这里可能有比你需要的最简单的形式更多的东西。出于示例的目的,我还将假设您的解析器是全局方法,但您应该避免在实际实践中这样做。抱歉有任何错别字,因为我在这里的所见即所得编辑器中这样做。

开始:

(功能 () {

"use strict";

var WebsiteDictionary = function () {

    return new WebsiteDictionary.fn.init();
};

WebsiteDictionary.fn = WebsiteDictionary.prototype = {

    constructor: WebsiteDictionary,

    init: function () {

         this._website["YouTube"] = YoutubeWebsiteParser();
         this._website["977Music"] = NineNineSevenMusicWebsiteParser();
         this._website["Grooveshark"] = GroovesharkWebsiteParser();
         this._website["SkyFM"] = SkyfmWebsiteParser();
         this._website["iHeart"] = IheartWebsiteParser();
         this._website["Live365"] = LiveThreeSixFiveWebsiteParser();
         this._website["Pandora"] = PandoraWebsiteParser();
         this._website["Spotify"] = SpotifyWebsiteParser();

        return this;
    },

   _website: {},


   GetArtistAndTitle: function(website, browser, stringToParse)
   {
      return this._website[website].GetArtistAndTitle(browser, stringToParse, website);
   }

   GetWebsiteLogoUri: function(website)
   {
      return this._website[website].WebsiteLogoUri;
   }


};


// Give the init function the love2DevApp prototype for later instantiation
WebsiteDictionary.fn.init.prototype = WebsiteDictionary.fn;

return (window.WebsiteDictionary= WebsiteDictionary);

}());

我相信这被称为关联数组,但不要引用我的话。基本上,JavaScript 对象的每个成员/属性都可以通过与访问 C# 中的 Dictionary 属性类似的方式进行访问。所以成员的名字就是字典键。我还编辑了名称,使它们成为有效的 JavaScript 名称。

我希望这有帮助。我认为这是一个非常漂亮的小 JavaScript 技术。如果您查看一些高调的 JavaScript 库,例如 jQuery,您会发现它被大量使用。

于 2013-09-04T00:44:29.650 回答