zoukankan      html  css  js  c++  java
  • 从Prism中学习设计模式之Adapter模式

    Prism是一款轻量级的WPF框架,用于建立复合的WPF应用程序,尽可能的将Ui和逻辑分开。在对这款框架的理解过程也是一个对设计模式的理解过程。

    Prism Link:http://compositewpf.codeplex.com/

                      图1

    如图1,是Prism的架构图,从中我们可以看到使用了多种设计模式,本文对Shell和Region中使用的Adapter模式进行扩展。

    Adapter模式的讲解:

    Link: http://www.cnblogs.com/cjfwu/archive/2013/03/23/2977878.html

    上文详细描述了Adapter模式的定义、实现。

    在Prism中Bootstrapper主引导类中在ConfigureRegionAdapterMappings虚方法中实现了以下控件的注册,提供相关类的适配转换:

    • ContentControl
    • TabControl(Sliverlight)
    • Seletor
    • ItemControl

    在Shell中实现控件的适配。代码如下:

    ConfigureRegionAdapterMappings
            protected virtual RegionAdapterMappings ConfigureRegionAdapterMappings()
            {
                RegionAdapterMappings regionAdapterMappings = ServiceLocator.Current.GetInstance<RegionAdapterMappings>();
                if (regionAdapterMappings != null)
                {
    #if SILVERLIGHT
                    regionAdapterMappings.RegisterMapping(typeof(TabControl), ServiceLocator.Current.GetInstance<TabControlRegionAdapter>());
    #endif
                    regionAdapterMappings.RegisterMapping(typeof(Selector), ServiceLocator.Current.GetInstance<SelectorRegionAdapter>());
                    regionAdapterMappings.RegisterMapping(typeof(ItemsControl), ServiceLocator.Current.GetInstance<ItemsControlRegionAdapter>());
                    regionAdapterMappings.RegisterMapping(typeof(ContentControl), ServiceLocator.Current.GetInstance<ContentControlRegionAdapter>());
                }
    
                return regionAdapterMappings;
            }

    以上我们知道了来龙去脉,这样我们可以通过复写改方法实现功能的扩展。

    如我们需要增加ListBox,实现如下:

    1.继承IRegionAdapter接口

    public class ListBoxRegionAdapter : IRegionAdapter
    {
        public IRegion Initialize(object regionTarget, string regionName)
        {
            ListBox listbox= regionTarget as ListBox;        
            return new Region();
        }
    }

    2.重写Bootstrapper的ConfigureRegionAdapterMappings方法,注册映射关系

    1 protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
    2 {
    3     RegionAdapterMappings regionAdapterMappings = base.ConfigureRegionAdapterMappings();
    4     regionAdapterMappings.RegisterMapping(typeof(ListBox), this.Container.Resolve<ListBoxRegionAdapter>());
    5     return regionAdapterMappings;
    6 }

    这样就完成了适配的扩展。

  • 相关阅读:
    es3的语法来模拟es5的bind方法
    js判断变量的类型(使用闭包来玩一把)
    获取一组时间中的最近的日期
    可以设置超时版的的fetch
    错误排查
    如何查看Linux的CPU负载
    shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作
    Swoole server函数列表(转载)
    php的反射
    PHP共享内存
  • 原文地址:https://www.cnblogs.com/tmywu/p/3033174.html
Copyright © 2011-2022 走看看