实现观察者模式以执行类中的方法

Posted

技术标签:

【中文标题】实现观察者模式以执行类中的方法【英文标题】:Implementing Observer Pattern to execute a method in a class 【发布时间】:2011-10-23 07:09:53 【问题描述】:

我正在使用 c# [ASP.NET 2.0 - VS 2005],并且我想实现观察者模式以在 DropDown 索引更改时触发方法(驻留在类中)。共有三个 DropDown 和一个 Label Control,当 DropDown 索引发生变化时,它们应该实时显示新生成的方案代码。

public sealed class GetSchemeCode:INotifyPropertyChanged


    private string _distCode;
    private string _blockCode;
    private string _schmType;


    public string DistCode
    
        get  return _distCode; 
        set  _distCode = value; 
    
    public string BlockCode
    
        get  return _blockCode; 
        set  _blockCode = value; 
    
    public string SchemeType
    
        get  return _schmType; 
        set  _schmType = value; 
    


    public GetSchemeCode()
    
        //
        // TODO: Add constructor logic here
        //
    


    protected string GetNewSchemeCode()
    
        SqlCommand cmdSchmCode = new SqlCommand("GenerateSchemeCode", dbConnection.cn);
        try
        
            cmdSchmCode.CommandType = System.Data.CommandType.StoredProcedure;
            //Add Parameters
            cmdSchmCode.Parameters.AddWithValue("@districtCode", DistCode.ToString());
            cmdSchmCode.Parameters.AddWithValue("@blockCode", BlockCode.ToString());
            cmdSchmCode.Parameters.AddWithValue("@schemeType", SchemeType.ToString());
            dbConnection.OpenConnection("Scheme");
            return cmdSchmCode.ExecuteScalar();
        
        catch (Exception)
        
            throw;
        
        finally
        
            cmdSchmCode.Dispose();
            dbConnection.CloseConnection();
        
    


【问题讨论】:

C# 有一个观察者模式实现 我想要世界和平,但这不是问题。你有什么问题?你试过什么?你被什么困住了? 我已经清楚地提到了我卡在哪里。无论如何,我想在任何属性更改时调用 GetNewSchemeCode() 方法。 @RPK - 抱歉,还是看不到。您可能需要提供更多详细信息。 你不会开火PropertyChanged。我同意这个问题不清楚。 【参考方案1】:

执行下面的代码来连接下拉列表的选定索引更改属性。我相信这就是 Asp.Net 在幕后对观察者模式的实现。您可以在代码或 html 标记中设置 AutoPostBack 属性和事件连接。

public GetSchemeCode()

        DistCodeDropDownList.AutoPostBack = true;
        DistCodeDropDownList.SelectedIndexChanged += new EventHandler(DistCodeDropDownList_SelectedIndexChanged);

        // TODO: Hook up the other DropDownLists here. as well


    void DistCodeDropDownList_SelectedIndexChanged(object sender, EventArgs e)
    
        CodeOutputLabel.Text = GetNewSchemeCode();
    

【讨论】:

【参考方案2】:

C# 已经取代了观察者模式,它有事件;事件是观察者模式的语言级实现。您要做的是在您的对象上创建一个事件,然后让您的观察者订阅它。

【讨论】:

以上是关于实现观察者模式以执行类中的方法的主要内容,如果未能解决你的问题,请参考以下文章

观察者模式实践-实现winform 窗体之间传值(事件实现)

Swift中的观察者模式

Java观察者模式:轻松实现对象间的一对多依赖

23种设计模式之观察者模式

观察者模式深度剖析

C++11之用std::function和std::bind实现观察者模式