`
lovebanyi
  • 浏览: 20283 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

总线模式

阅读更多
为什么叫总线模式

当时我碰到的问题是这个样子的。我有一个叫做 BecomePaidMember(成为付费用户)的页面,这个页面涉及到的功能模块非常的多。然后我还有一个页面叫做UpgradePackage(升级包)的页面。里面同样包含了跟BecomePaidMember一样的东西,选择支付方式,选择合约时间,选择。。。有非常多的选择,未来也有可能加进新的选择。然后这些选择项之间又有互相关联,关系是不确定的(后面的需求会发生变化)。 比如选择了支付方式 1 就会造成选择合约的时间变化。合约时间的变化可能又会造成其它东西的变化。

这里面有一个东西是不太会变化的,就是哪些选择项还是有顺序的。就是有时候可能会触发一些事件有时候不会,总的发说是前面的会触发后面的。然后当时想到的是,计算机里面好象一个叫总线的东西然后数据都是通过它来传输的。然后我们的局域网(没有交换机)的情况下数据也是广播形式的传播然后每个网卡自己会去判断这个数据是不是发给它的。

为了结构的清晰很明显我们需要将每一个选择项做成 UserControl. 每一个需要刷新的显示单元也做成UserControl.

跟据一些旧的知识我们知道这边首先要彩用的是观察者模式(.net里可以用事件来),于是我们暴露了很多的事件

但是如果我们在页面来组织哪些事件的话,就会造成我们两个页面(未来可能三个或更多),我们就要写一大堆的事件处理的方法在页面哪边。并且如果是一个新的页面我们就要又多写一次了,所以我们使用新的方法来处理它,
我们可以在每一个项目里取一个叫做DataBus的类,然后再弄一个叫做UpgradeInfo的类。这个类里就放了很多的事件和属性,方法。用来协调哪些UserControl的。

    public class DataBus
    {
        private readonly static object upgradeKey = new object();
        public static UpgradeInfo UpgradeInfo
        {
            get
            {
                if (HttpContext.Current.Items.Contains(upgradeKey))
                {
                    return HttpContext.Current.Items[upgradeKey] as UpgradeInfo;
                }
                else
                {
                    UpgradeInfo info = new UpgradeInfo();
                    HttpContext.Current.Items.Add(upgradeKey, info);
                    return info;
                }
            }
        }
    }
UpgradeInfo的代码片断

public class UpgradeInfo

{

public int PackageID
        {
            get
            {
                if (ViewState["PackageID"] != null)
                {
                    return (int)ViewState["PackageID"];
                }
                return 0;
            }
            set
            {
                if (ViewState["PackageID"] != null)
                {
                    int temp = (int)ViewState["PackageID"];
                    if (temp != value)
                    {
                        ViewState["PackageID"] = value;
                        OnPackageChange();
                    }

                }
                else
                {
                    ViewState["PackageID"] = value;
                    OnPackageChange();
                }
            }

        }

#region event
        private EventHandlerList HandleList = new EventHandlerList();
        private static readonly object ActionPackage = new object();

public event Action PackageChange
        {
            add
            {
                HandleList.AddHandler(ActionPackage, value);
            }
            remove
            {
                HandleList.RemoveHandler(ActionPackage, value);
            }
   /// <summary>
        /// When Select Package has been change
        /// </summary>
        private void OnPackageChange()
        {
            OnAction(ActionPackage);
        }
        public Func<int> CurrentStepFunc
        { get; set; }

}
有属性有事件有方法,然后某个UserControl自己注册事件,引发事件,如果可以提供Step信息的就自己去给CurrentStepFunc赋一个函数。

Ok大功告成。

真正的结构应该是另一种方式的,控件本身自己监听哪个数据(比如在Oninit的时候去判断某个东西有没有变化,但是实际情况可能不好这样做。因为usercontol加载还是有顺序的,结果某个东西可能就没的监听到所要的变化)
所以我们现在用的稍微有点点不一样的地方。

然后呢我们还会碰到一个问题。事件不断触发,绑定函数的重复调用

我们有一个FeeSummaryView的UserControl这个control在 pakcage变了 合约时间的变时候价格会发生变化。如果我们每次发生变化都要去直接调用,这个时候我们会想每次变化只调用一次就好了。(由于事件的传递会产生新的事件),后面我们参考了一下Usercontrol的生命周期,我们使用的一个变量IsDirty来标志这个控件是否需要更新,如果IsDirty是true的话则会被重新绑定了
private bool IsDirty
{
    get
    {
        if (ViewState["IsDirty"] != null)
        {
            return (bool)ViewState["IsDirty"];
        }
        return false;
    }
    set
    {
        ViewState["IsDirty"] = value;
    }

}
rotected override void OnPreRender(EventArgs e)
{
    Bind();
    base.OnPreRender(e);
}
private void Bind()
{
    if (IsDirty)
    {
        IsDirty=false;
    }
}
主要的思想还是把会变化的东西移到其它地方, 高内聚,低耦合
UserControl本身控件控制他自己所要控制的东西
分享到:
评论

相关推荐

    【Java 设计模式-源码】数据总线模式:高效统一组件通信

    考虑一个大型机场作为数据总线模式的类似现实世界示例。在机场中,各种航空公司、乘客、行李搬运工和安全人员都需要进行通信和共享信息。与其让每个实体直接与其他每个实体进行通信,机场使用了一个集中式的公告系统...

    PIC单片机的CAN总线模式1的16路接收程序

    PIC单片机的CAN总线模式1的16路接收程序

    car:命令总线模式的 PHP 实现

    命令总线模式的目标是将域代码隔离在原子、可测试和可重用的类中,并通过专用服务执行它们。 ##用法 命令就是命令。 它可以包含您需要的数据。 属性可以在构造上设置,通过表单填写,由其他服务设置,...... ...

    消息总线java实现

    在软件开发中,消息总线是一种重要的设计模式,它允许组件之间通过解耦的方式进行通信。消息总线的实现通常涉及消息的生产、传输和消费,以及相应的消息队列和调度策略。本作业将深入探讨如何使用Java语言来实现一个...

    W5100与8位MCU 直接总线接口模式源代码

    在直接总线模式下,8位MCU可以通过地址线、数据线和控制线直接访问这些内存区域。 在8位MCU如AVR或8051上,实现直接总线接口通常需要以下步骤: 1. **配置GPIO**:将MCU的某些GPIO引脚配置为地址线、数据线和控制...

    基于CANoe的can总线通信模拟研究.docx

    【CAN总线基础】 CAN(Controller Area Network)总线是一种多主站的串行通信协议,最初由Bosch公司开发,适用于汽车电子系统,现已成为工业自动化领域广泛应用的现场总线。CAN总线的特点包括高实时性、错误检测能力...

    基于stm32的sdio用4位总线24mhz dma模式操作sdhc卡.doc

    在使用 4 位总线模式时,需要正确地配置 SDIO 外设的时钟频率和总线宽度来实现高速数据传输。这里,我们可以使用 STM32 的 SDIO 外设来配置时钟频率和总线宽度,并使用 DMA 模式来实现高速数据传输。 最后,在使用 ...

    C#版本EventBus事件总线实例源码

    2. "C#版本EventBus事件总线实例源码":这是主要的源代码文件,包含了事件总线模式的实现。文件可能包含以下关键部分: - `EventBus` 类:作为事件的中央调度器,它负责注册订阅者、发布事件以及分发事件到相应的...

    2440 IIC总线 翻译

    在多个主机(主设备)参与的IIC总线模式下,多个主设备可以与从设备进行数据的收发。主机设备负责发起数据传输或终止数据传输。在S3C2440A微处理器中,IIC总线操作遵循标准的总线仲裁过程。 在IIC总线的四种操作...

    基于PCI9052的PCI局部总线的设计

    它能够支持多种工作模式,并且提供了一系列的功能特性来满足不同应用场景的需求。 - **基本功能**:PCI9052支持PCI总线的基本操作,包括数据传输、地址和控制信号的处理等。 - **桥接能力**:该器件可以作为PCI总线...

    ESB企业服务总线简介(2)

    ESB提供了多种部署模式,包括全连接的总线模式、集中可拔插方式的总线模式和分布式级联的“雪花状结构”。这些模式为企业提供了适应不同场景的解决方案,可以根据业务需求进行定制。 然而,尽管ESB有许多商业和开源...

    基于Java的高性能、低时延、高可用zbus服务总线设计源码

    该项目是一款基于Java的高性能、低时延、高可用zbus服务总线设计源码,包含198个文件,涵盖152个Java源文件、...该系统专注于RPC和消息队列服务,适用于构建轻量级服务总线架构,满足高效数据处理和系统间通信的需求。

    C#版本EventBus事件总线实例源码-9s.rar

    通过研究这个实例源码,开发者可以更好地理解和运用事件总线模式,以优化C#应用程序的设计和架构。 总结起来,C#版本的EventBus事件总线实例源码为我们提供了一种在项目中实现解耦和高效通信的方式。通过创建和管理...

    C#版本EventBus事件总线实例源码_(0610).rar.rar

    这个压缩包“C#版本EventBus事件总线实例源码_(0610).rar.rar”包含了C#实现事件总线模式的一个实例源码,我们可以从中学到如何在C#中应用事件总线。 事件总线的主要思想是将事件发布者与事件订阅者解耦,使得它们...

    行业分类-设备装置-一种ISA总线到Multibus总线的读写操作转换电路.zip

    Multibus则是早期的多处理器系统和工业计算机系统中常见的总线标准,它支持更高级别的并行性和系统扩展性,具有32位数据宽度和多种总线模式。 转换电路在此扮演了关键角色,它的设计目标是解决两个不同总线标准间的...

    PCI总线主模式设计

    ### PCI总线主模式设计详解 #### 一、引言 随着计算机技术的快速发展,总线接口技术也在不断地进步和演变。近年来,ISA总线逐渐退出历史舞台,而PCI(Peripheral Component Interconnect)总线因其在速度、性能及...

    Protues-bus-mode.rar_protuesbus

    在 Protues 中使用总线模式(Bus Mode)进行电路设计,能够极大地提高绘制电路图的效率,特别是在处理多引脚元件或者需要大量连接线的复杂电路时。本文将详细介绍如何在 Protues 中利用总线模式来高效地创建电路。 ...

    乐华彩电机型总线.pdf

    - 对于P87C766BDRT,可以通过直接短路CPU的特定脚位(如35脚)到地来进入总线模式。 - 遥控芯片的某些脚位短路也可以实现进入,例如遥控芯片的3脚和11脚。 - 对于不同品牌和型号的机芯,进入总线的方法也有所不同...

Global site tag (gtag.js) - Google Analytics