1. Definição do princípio de abertura e fechamento:
1. A entidade de software deve ser aberta para extensão e fechada para modificação.
2. Quando os requisitos do aplicativo mudam, a função do módulo pode ser estendida para atender aos novos requisitos sem modificar o código-fonte e o código binário da entidade de software.
3. Entidades de software incluem: módulos, classes e interfaces, métodos divididos no projeto
2. O papel do princípio de abertura e fechamento:
1. Pode melhorar a capacidade de reutilização do código
2. Pode melhorar a capacidade de manutenção do software
3. Realização do princípio de abertura e fechamento:
1. O princípio de abertura e fechamento pode ser realizado por meio de "restrições abstratas e alterações de encapsulamento", ou seja, uma camada de abstração relativamente estável é definida para software por meio de interfaces ou classes abstratas, e os fatores variáveis são encapsulados na mesma classe de realização concreta.
2. Por causa da abstração Boa flexibilidade e ampla adaptabilidade. Contanto que a abstração seja razoável, a estabilidade da arquitetura do software pode ser basicamente mantida, e os detalhes mutáveis no software podem ser estendidos a partir das classes de implementação derivadas da abstração. Quando o modo do software muda, ele só precisa ser reconstruído de acordo com as necessidades. Basta derivar uma classe de implementação
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);
}
Princípio de abertura e fechamento do plug-in do notebook