一、开闭原则的定义:
1.软件实体应当对扩展开放、对修改关闭。
2.当应用的需求发生改变时,在不修改软件实体的源代码和二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
3.软件实体包含:项目中划分的模块,类与接口、方法
二、开闭原则的作用:
1.可以提高代码的复用性
2.可以提高软件的可维护性
三、开闭原则的实现:
1.可以通过“抽象约束、封装变化”来实现开闭原则、即通过接口或者抽象类为软件定义一个相对稳定的抽象层,而将可变因素封装在相同的具体实现类中
2.因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定,而软件中易变的细节可以从抽象派生来的实现类进行扩展,当软件方式变化时,只需要根据需求重新派生一个实现类就好了
Type typeInterface;
private ArrayList plugins = new ArrayList();//存放插件
int counts = 0;
private void Form1_Load(object sender, EventArgs e)
{
InterfaceByNote editor;
this.FormBorderStyle = FormBorderStyle.FixedDialog;//固定窗体
#region 03
//先获取程序集目录路径
string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Addons");
string[] interpath = Directory.GetFiles(path, "*.dll");
for (int i = 0; i < interpath.Length; i++)//循环每个dll文件
{
Assembly asm = Assembly.LoadFile(interpath[i]);
//获取程序集里的所有公共类
Type[] types=asm.GetExportedTypes();
typeInterface = typeof(InterfaceByNote);//获取接口的type
for (int r = 0; r < types.Length; r++)
{
//循环遍历每个类,判断当前类是否实现了接口
if (typeInterface.IsAssignableFrom(types[r])&&!types[r].IsAbstract)
{
editor = (InterfaceByNote)Activator.CreateInstance(types[r]);//创建对象并保存到接口类型集合
ToolStripItem T=this.编辑EToolStripMenuItem.DropDownItems.Add(editor.Name.ToString());
plugins.Add(editor);
T.Tag = counts;
counts++;
T.Click += T_Click1;
}
}
}
#endregion
}
private void T_Click1(object sender, EventArgs e)
{
ToolStripItem s=sender as ToolStripItem;
InterfaceByNote st=(InterfaceByNote)plugins[Convert.ToInt32(s.Tag)];
st.Run(this.textBox1);
}
笔记本插件式开发 -开闭原则