Curado programa de diseño de patrón en C #

 

 

Yi Xu:  artículos C # avanzada. Traductor Samir para C # ejemplo proporcionado por una simple orden (algo de código proporcionado por el autor en el entorno del traductor no puede compilar), y la preparación del ejemplo el C ++ correspondiente, ponen juntos en la anotación, por lo que la comparación lector. Traducción de todos los C #, C ++ entorno de depuración son Microsoft Visual Studio.NET 7.0 Beta2.

Resumen:  Al proporcionar un marco, patrones de diseño pueden resolver muchos problemas en el desarrollo de aplicaciones. Modo hace que el proceso de diseño más claro y eficiente, es especialmente adecuado para desarrolladores de C #, C #, porque es un lenguaje orientado a objetos. 【Anotación: Debido a los patrones de diseño de origen y el punto de partida consiste en describir el (reutilizable) diseño de software orientado a objetos】 patrones de diseño existente proporciona una excelente plantilla para su propia clase de diseño, patrones de uso puede acortar el ciclo de desarrollo de software. Este artículo se describen varios patrones de diseño más populares, incluyendo Singleton, estrategia, decorador, compuesto y estado, se les puede utilizar en sus propias aplicaciones, lo que mejora la escalabilidad de la aplicación y hacer más fácil la reutilización de la clase.

   Como cualquier desarrolladores de software orientado a objetos sazonados son conscientes, la falta de la comprensión básica la mayoría de los patrones de diseño de las discusiones de la arquitectura de diseño de software es increíble. Si hay no todo lo que la mayoría de las aplicaciones de software, herramientas y sistemas utilizan al menos una aún más los patrones de diseño. Patrón de diseño es una descripción de una clase de interacción, estas clases proporcionan un marco para resolver el problema general de contextos específicos. En otras palabras, el patrón proporciona una solución para el problema de desarrollo de software de objetos específicos. Además, el patrón general de limitar su atención a las soluciones de adaptación relacionados con las limitaciones y otros factores. Y una conexión de comunicación entre los detalles y las clases de contexto y juntos definen un patrón, el problema de que cualquier diseño y características de software orientado a objetos de las condiciones que coinciden necesario para proporcionar una solución.

   Debo admitir que era un ardiente partidario de patrones de diseño. Desde que leí la Gamma, Helm, Johnson y co-autor del libro que Vlissides inventiva "patrones de diseño", ya que raramente hacemos ningún software patrón y el diseño. De hecho, pasé un tiempo considerable en las primeras etapas de diseño de software se puede utilizar para decidir la futura arquitectura y el ajuste del modelo natural. Después de todo, el modelo se prueba el tiempo transcurrido y aplicaciones por alguna solución al problema, ese problema ha sido resuelto y experimentados diseñadores, desarrolladores y expertos en idiomas. Cualquier persona que va a una perspectiva de diseño de software, su uso podría ser el uso de los conocimientos y la experiencia es sabia. El uso se ha demostrado en repetidas ocasiones ser una solución exitosa y no un invento nuevo desde cero es a menudo una buena idea.

   Pocos desarrolladores pueden escribir solamente disfrutar del lujo de un pequeño programa. aplicaciones y sistemas modernos son complejos, a menudo se componen de miles de líneas de código y el código sobre la base de estos códigos son aún más enorme. herramientas simples y dominio del lenguaje no es adecuada para las necesidades de la programación, las empresas de desarrollo de software generalmente se requiere tener una gran flexibilidad en el diseño y la arquitectura para adaptarse a las cambiantes demandas en diferentes etapas de desarrollo del producto del cliente, incluso después del lanzamiento de un producto suele ser el caso. Este requisitos dinámicos del diseño de software deben ser robustas. Debe ser capaz de adaptarse al cambio y no causará ninguna reacción en cadena no deseado - no debe requerir la reescritura de los sistemas potencialmente irrelevantes (sub). Añade funciones y componentes para el módulo no tiene capacidad de expansión es frustrante y difícil de lograr los objetivos deseados. Cerrado, cambio de diseño inelástico antes o después de ser aplastado por la presión. Los patrones de diseño ayuda a sentar las bases marco flexible, que es una característica común de cada buen diseño orientado a objetos.

   Los patrones de diseño han sido catalogadas clasificadas para resolver pequeños problemas incluso para los problemas a nivel de la arquitectura a gran escala. En este artículo se introducirá varios patrones de diseño popular en mis propios proyectos, los encuentro muy útil. Aunque familiarizado con el concepto de diseño orientado a objetos ayuda a comprender este artículo, pero no asuma que tiene algún conocimiento previo de los patrones de diseño. Aunque cualquier lenguaje de programación desarrollo orientado a objetos adecuados se puede utilizar para esclarecer el modo, pero sólo será ejemplo usando C # [Anotación escrito: Pero no estoy J Te estoy dando una muestra completa y C # que corresponde C ++ con el fin de estar familiarizado con C ++ lectores para comparar J], sino también para llevar esto a demostrar el poder de la lengua. No voy a discutir los detalles de las bibliotecas de clases de Microsoft .NET. En lugar de ello, me centraré en el uso de lenguaje C # como una herramienta para el software de diseño orientado a objetos.
C # y patrones de diseño

   de C # es un lenguaje de programación moderno, que asigna directamente la estructura sintáctica y semántica apoyan el concepto de diseño orientado a objetos proporcionando para promover el desarrollo de software orientado a objetos. Esto es muy diferente de C ++, soportes C ++ proceso orientado-, orientado a objetos y programación genérica. Sin embargo, si usted es un programador de C ++, C # seguimiento es muy fácil. Para los programadores de C ++, la curva de aprendizaje es bastante plana. Incluso si usted nunca ha visto antes en ningún código C #, comprender el código de ejemplo en este artículo no debe tener ningún problema. De hecho, si usted encuentra que los patrones de C # de diseño para lograr una mayor claridad, no voy a tener ninguna sorpresa, sobre todo si ya ha utilizado anteriormente patrones de diseño para escribir el código de palabras. Discusión general de los patrones de diseño de libros y artículos se describirá en detalle el modo de resolver el problema de contexto y detalles, y luego proporcionar una descripción de una solución estándar. Este artículo no será tan estricta, mi única preocupación es la naturaleza de los modelos, complementada con los ejemplos adecuados de C # que se describirá.

   Empecemos con el patrón de diseño más simple comenzó: Singleton.

semifallo 

   Cualquier desarrolladores MFC que escriben aplicaciones (aplicación no importa cómo se escribe poco) sabe lo que es Singleton. instancia singleton de la clase única. Cuando se utiliza MFC, es una instancia singleton de la aplicación desde la clase derivada de CWinApp global. Por supuesto, en las aplicaciones MFC, si bien las disposiciones no se les permite crear una segunda instancia de la clase de aplicación, pero no hay nada que le impida hacerlo. 【Anotación: De hecho, si VC7.0Beta2 VC6.0, sus compiladores pueden limitar a crear una segunda instancia de un cierto punto. La razón por la cual, en cierta medida, ya que el compilador como este caso no le ayuda a comprobar - intenta crear una segunda instancia de la clase de aplicación en forma de un botón en el evento] En este caso, cuando se necesita una cuando una clase particular mostró un comportamiento único, una alternativa mejor es asegurarse de que esta clase sólo será responsable de su propio creado uno y sólo un ejemplo. Volver a MFC, sabemos que la única instancia de la clase para asegurar la aplicación de la responsabilidad se deja al programador para desarrollar aplicaciones, él (ella) debe tener cuidado de no crear una segunda instancia de la clase de aplicación.

   Ahora echa un vistazo a la clase se muestra en la Tabla 1. El acceso está limitado a un mosto de Singleton Instancia por el método estático. En la mayoría de los casos, Singleton debe tener visibilidad global, lo cual puede lograrse mediante la creación de su público métodos. Y la variable global varios convertidores analógico Singleton, este modelo puede impedir la creación de un exceso de ejemplo, mientras que tanto la visibilidad global. Tenga en cuenta que el constructor de clase es privado, lo que significa que no hay manera de evitar el método estático ejemplo, para crear una instancia de la clase directamente.

   Tabla 1

clase Singleton
{
private static Singleton = null;
public static Singleton Instancia ()
{
si (null == Singleton)
Singleton Singleton = new ();
Singleton regresar;
}
Singleton privada ()
{
}
}


   efecto patrón singleton más que eso, en particular, puede ser extendido para crear un número variable de instancias de la clase. Suponiendo una aplicación, cuando se necesita para llevar a cabo tareas específicas que necesita para programar un subproceso de trabajo. Teniendo en cuenta los recursos de ahorro del sistema que usamos para lograr esta clase Singleton hilo. Al poco tiempo, la necesidad Singleton tareas de procesamiento de hilo se densa arriba, si decidimos ampliar esta aplicación, podemos aumentar fácilmente el número de subprocesos de trabajo, porque toda la creación del hilo lógico y su autorización de acceso se definen en una clase.

   Otra ventaja es el patrón Singleton creada puede ser retrasada hasta que realmente se necesita, como se muestra en la Tabla 1. No importa si necesita variables globales comienzan a crearse, pero el objeto global no es necesariamente siempre necesarios. C # no soporta las variables globales, pero todavía es posible desde el principio de un método para crear un objeto en el montón y lo utilizan hasta mucho más tarde. Si es así, el patrón Singleton ofrece una solución elegante para este tipo de casos.

   Además, como una herramienta en el modo de realización de Singleton, C # que C ++, aunque esta ventaja es muy sutil, pero sin duda importante. Necesidad de considerar una serie de cuestiones espinosas y gestión del ciclo de vida para llevar a cabo la realización de C ++ singleton basada y tratamiento automatizado de tiempo de ejecución en C # por. Esta ventaja es significativo en el patrón Singleton en C # versión, sólo es necesario para asegurar que cuando se necesita un producto único, puede tener una referencia en vivo.

   Anotación: El siguiente es un ejemplo completo de la pauta singleton

   C # ejemplo:


using System;
clase Singleton
{
private static Singleton = null;
public static Singleton Instancia ()
{
si (null == Singleton)
Singleton Singleton = new ();
Singleton regresar;
}
Singleton privada ()
{
}
}
Aplicación de clase
{
public static void Main ()
{
Singleton s1 = Singleton.Instance ();
// Singleton s2 = new Singleton (); //错误:构造器不可访问
Singleton s2 = Singleton.Instance ();
si (s1.Equals (s2)) //引用相等
Console.WriteLine ( "instancias son idénticos");
}
}

/ *以下是程序输出结果:
Las instancias son idénticos
* /


   C++示例:【译注:译者在自己的程序实践中,几乎从未将类的声明和实现搅和在一起,此处示例代码之所以是如此写法,只是为了便于大家阅读和比对而已】

#include "stdafx.h";
#include
class Singleton
{
public:
static Singleton* Instance()
{
if (NULL == singleton) singleton = new Singleton();
return singleton;
};
private:
Singleton()
{
};
private:
static Singleton* singleton;
};
Singleton* Singleton::singleton = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
Singleton* sgt1 = Singleton::Instance();
Singleton* sgt2 = Singleton::Instance();
if(sgt1 == sgt2)
cout<<"Instances are identical\n";
delete sgt1;//【译注:这个简单的例子里,是不存在内存泄漏或棘手的生命期管理问题的J】
return 0;
}
/*以下是程序输出结果:
Instances are identical
*/


strategy 

   应用常因用户输入、运行平台和部署环境等的不同执行的任务亦不相同。以磁盘文件异步I/O举例,Windows NT/2000下的Win32 API对异步I/O提供了原生支持,但Windows 95/98并非如此。因此,依赖于异步文件I/O的应用就必须实现两套不同的算法,根据部署环境不同,一套可使用Win32 API,另一套可能要采用多线程技术从头写起。而对于客户来说一般不会意识到执行了不同算法,他(她)们所关心的只是得到同样的结果,他(她)们也只关心这个。

   另一个例子是从互联网上的远程服务器下载文件。提供文件下载服务的应用接受一个URL和一个协议(如FTP或HTTP),然后创建一个使用该协议和远程服务器通讯的对象。根据用户不同输入,使用不同的算法(协议)。但结果是一样的:下载了一个文件。

   让我们看一个更具体的例子:素数测试。表2所示的代码声明了一个接口(C#中的一个概念),它只有一个方法:IsPrime。

   表2

interface Strategy
{
bool IsPrime(int n);
}


   接口就象一个合约,它是所有派生类必须遵从的规范。更为特别的是,它定义方法的签名但并不实现它们,实现接口的具体类必须提供这些方法的实现。在这一点上,C#明显优于C++,因为C++缺乏对接口在语言上的原生的支持。C++程序员一般是通过定义只包含纯虚成员函数的的抽象类来创建接口。在C#中,所有接口成员都是public的,所有实现接口的类都必须实现接口中所有方法。

   现在假定我们有三个不同的素数测试算法,每一种都有自己的性能和精度指标。其中之一属于计算密集型,对因数进行彻底测试,另外一种算法速度较快但对大数的测试结果未必准确。我的应用就是要询问用户期望何种执行性能,然后根据其选择调用相应的算法。我把算法封装到实现Strategy接口的若干个类中。参见表3示例代码。

   表3

class Fermat : Strategy
{
public bool IsPrime(int n)
{
bool result = false;
//使用Fermat法测试n是否为素数,果真,则更新result的值
Console.WriteLine("Using Fermat's test");
return result;
}
}

Supongo que te gusta

Origin www.cnblogs.com/bbc2020/p/12457273.html
Recomendado
Clasificación