从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 }

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

原文地址:https://www.cnblogs.com/tmywu/p/3033174.html