如此一来,在 Application Frame Level 的核心库中存在的是抽象接口以及一些泛化的细节。这些内容在第一次安装团队产品时就已经部署在用户的机器上了。它不会自动销毁,直到用户提交把它从本地移除的请求。GUI Level 提供了团队产品泛化后的统一的界面组件(比如:属性编辑器、数据库操作界面等可重用组件)。特化的产品(Speciallized Application)通过实现 Application Frame Level 中的某些接口实现可扩展性,通过使用 GUI Level 中的的类来实现用户界面。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)以下是一个简单的静态图(接口和类的成员将在下面详细阐述):
2. IConnectableObject
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
public interface IConnectable { // application 为插件所属的主框架对象。若为null则表示插件本身就是主框架 ConnectionResult Connect( object application ); ExtendibleVersionInfo VersionInfo { get; } void OnDestory(); void OnLoad(); void Run();}public enum ConnectionResult { Connection_Success , Connection_Failed}public class ExtendibleVersionInfo { private ExtendibleVersionInfo() {} public ExtendibleVersionInfo( string name , string version , string copyright ) { // Omitted } public ExtendibleVersionInfo(string name,int version1,int version2,int version3,string copyright) { // Omitted } public int PrimaryVersion { get { return _Version1; } } public int SecondaryVersion { get { return _Version2; } } public int BuildVersion { get { return _Version3; } } public string Name { get { return _Name; } } public string VersionString { get { // Omitted } } public string Copyright { get { return _Copyright; } } private string _Name; private int _Version1 = 1; private int _Version2 = 0; private int _Version3 = 0; private string _Copyright; public static ExtendibleVersionInfo Empty = new ExtendibleVersionInfo();}
所有可连接的对象必须实现这个接口。这是所有 Application Frame Level 中类的鼻祖。
3. IExtendible
public interface IExtendible { IConnectable GetLatestVersion(); IConnectable QuerySpecifiedVersion( ExtendibleVersionInfo version ); ExtendibleVersionInfo[] EnumerateVersions();}
4. 使用类工厂创建应用程序和插件的最新版本
我们的主程序以及插件会设计成 internal class 。程序只输出一个工厂类,用户界面通过调用 IExtendible 接口的 GetLatestVersion() 方法获得这些用来完成实际任务的对象的实例,并把它们显示出来。或者,也可以枚举所有的版本,让用户来挑选所需要版本。
5. 可扩展性
不得不承认,这样的方式可扩展性仍不是很强。程序需要升级时同时需要修改提供给用户的工厂类(虽然接口不变)。为了实现更好的可扩展性,可以把简单工厂模式转换为工厂方法模式。