wikidex traduccion pokemon pattern patron game c++ design-patterns facade

traduccion - ¿Explicar el patrón de Facade con el ejemplo de C++?



facade wikidex (6)

En cierto sentido, Facade es solo una API para clientes que desean interactuar con algo oculto.

La Fachada es útil cuando se expone una API simple de C para algo implementado en C ++ o simplemente más complejo que la API. O para obtener una barrera fija entre un cliente y una biblioteca cuando la biblioteca necesita pasar por numerosas actualizaciones iterativas y desea afectar al cliente lo menos posible. Por ejemplo, si una biblioteca basada en C necesita actualizarse internamente a C ++ o alguna otra cosa, o simplemente cambiarse por algo completamente diferente, entonces la Fachada es una buena capa intermedia para el cliente.

Lo he consultado con el artículo de wikipedia , y parece que falta la versión c ++ de un ejemplo de código. No puedo apreciar completamente el patrón de Fachada sin esto, ¿me pueden ayudar a explicarlo usando C ++?



He hecho una búsqueda y reemplazo en el ejemplo de C #. Puede que esto no te ayude, porque si entiendes C ++ entonces deberías ser capaz de entender el C # ya que usa las mismas construcciones y palabras clave (clases, funciones, espacios de nombres, público, etc.)

// "Subsystem ClassA" #include <iostream> class SubSystemOne { public: void MethodOne() { std::cout << " SubSystemOne Method" << std::endl; } } // Subsystem ClassB" class SubSystemTwo { public: void MethodTwo() { std::cout << " SubSystemTwo Method" << std::endl; } } // Subsystem ClassC" class SubSystemThree { public: void MethodThree() { std::cout << " SubSystemThree Method" << std::endl; } } // Subsystem ClassD" class SubSystemFour { public: void MethodFour() { std::cout << " SubSystemFour Method" << std::endl; } } // "Facade" class Facade { SubSystemOne one; SubSystemTwo two; SubSystemThree three; SubSystemFour four; public: Facade() { } void MethodA() { std::cout << "/nMethodA() ---- " << std::endl; one.MethodOne(); two.MethodTwo(); four.MethodFour(); } void MethodB() { std::cout << "/nMethodB() ---- " << std::endl; two.MethodTwo(); three.MethodThree(); } } int Main() { Facade facade = new Facade(); facade.MethodA(); facade.MethodB(); return 0; }


Patrón de fachada: proporciona una interfaz unificada y simplificada para un subsistema complejo o conjunto de interfaces. Proporciona una interfaz de nivel superior que desacopla simultáneamente al cliente del subsistema complejo.

Un ejemplo para ayudarlo a entender ... un taxista. Le dice al conductor del taxi ''Llévame a PointX'' (interfaz simplificada unificada de alto nivel) que luego comienza una secuencia de acciones (gira la tecla, cambia de marcha, presiona el acelerador, etc.) para realizar la tarea. Él abstrae la complejidad de los subsistemas subyacentes (caja de engranajes, motor, etc.) para que no tenga que preocuparse por ellos. El conductor también lo desacopla del vehículo real utilizado ... usted no se conecta directamente con el automóvil. Podrías darle un Merc pero tu interfaz con el Driver seguiría siendo TakeMeTo (X) ... no estás atada a ningún modelo / marca específico del automóvil.

En un ejemplo del mundo real, encontrará fachadas donde interactúa con componentes o bibliotecas de terceros. No desea que su código dependa de un proveedor específico, por lo que debe introducir una interfaz de fachada para desacoplarse. También simplificará esta interfaz, por ejemplo, su interfaz de fachada tendrá un método llamado SendData (cadena) pero internamente la implementación puede llamar n métodos en m subpaquetes en un orden específico para realizar la tarea. Esto es lo que muestra el diagrama en la página de wikipedia.

Por ejemplo, traducir un ejemplo a C ++ y mantenerlo pequeño

sResource = LWCPPSimple::get("http://www.perl.org")

Aquí, la Biblioteca ficticia para WWW en C ++ es una fachada que unifica el protocolo, la red y los aspectos de análisis del problema para que pueda concentrarme en mi enfoque principal de buscar el recurso. El método get oculta / encapsula / mantiene en un lugar la complejidad (y en algunos casos fealdad) de HTTP, FTP y otros protocolos variados, solicitud-respuesta, gestión de conexión, etc. También si mañana los creadores de LWCPPSimple encuentran un forma de hacer que get () sea el doble de rápido, obtengo los beneficios de rendimiento de forma gratuita. Mi código de cliente no tiene que cambiar.


class Engine { public: void Start() { } }; class Headlights { public: void TurnOn() { } }; // That''s your facade. class Car { private: Engine engine; Headlights headlights; public: void TurnIgnitionKeyOn() { headlights.TurnOn(); engine.Start(); } }; int Main(int argc, char *argv[]) { // Consuming facade. Car car; car.TurnIgnitionKeyOn(); return 0; }


class A { private B b; // Class A uses Class B, the "interface" public int f() { return b.g(); } }; class B { private C c; // class B uses class C, a "subsystem" private ... ...; // other subsystems can be added public int g() { c.h(); return c.i(); } }; class C { // a subsystem public void h() { ... } public int i() { return x; } };

La clase A no utilizará directamente ningún método ni afectará directamente el estado de la clase C o cualquier otro subsistema que contenga la clase B. Aquí solo se muestra un subsistema porque no importa cuántos subsistemas haya.