从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 }
这样就完成了适配的扩展。