2008-10-30 34 views
15

Tôi đã kiểm tra với wikipedia article và có vẻ như nó thiếu phiên bản C++ của ví dụ mã. Tôi không thể đánh giá đầy đủ mô hình Mặt tiền mà không có điều này, bạn có thể vui lòng giúp giải thích cho tôi bằng cách sử dụng C++ không?Giải thích mẫu Mặt tiền với ví dụ C++?

+0

bạn có thể vui lòng cung cấp liên kết tới bài viết không? –

+0

http://en.wikipedia.org/wiki/Facade_pattern – yesraaj

+0

Chỉnh sửa câu hỏi của bạn sẽ hữu ích hơn cho người khác. – tonylo

Trả lời

21

Mẫu mặt tiền: cung cấp giao diện đơn giản - thống nhất cho một hệ thống con phức tạp hoặc một bộ giao diện. Nó cung cấp một giao diện mức cao hơn đồng thời tách client khỏi hệ thống con phức tạp.

Ví dụ để giúp bạn hiểu .. trình điều khiển cab. Bạn nói với tài xế taxi 'Đưa tôi đến PointX' (giao diện cấp cao đơn giản hóa thống nhất), sau đó bắt đầu trên một chuỗi các hành động (chuyển khóa, thay đổi bánh răng, nhấn máy gia tốc, vv ..) để thực hiện tác vụ. Ông tóm tắt sự phức tạp của các hệ thống phụ cơ bản (hộp số, động cơ, vv) để bạn không phải lo lắng về chúng. Người lái xe cũng tách bạn khỏi chiếc xe thực tế được sử dụng ... bạn không trực tiếp giao tiếp với chiếc xe. Bạn có khả năng có thể cung cấp cho anh ta một Merc nhưng giao diện của bạn để Driver vẫn sẽ là TakeMeTo (X) .. bạn không gắn liền với bất kỳ mô hình cụ thể/làm cho chiếc xe.

Trong ví dụ thế giới thực, bạn sẽ tìm thấy các mặt tiền nơi bạn giao tiếp với các thành phần hoặc thư viện của bên thứ ba. Bạn không muốn mã của bạn phụ thuộc vào một nhà cung cấp cụ thể, vì vậy bạn giới thiệu một giao diện mặt tiền để phân tách. Ngoài ra, bạn sẽ đơn giản hóa giao diện này, ví dụ: giao diện mặt tiền của bạn sẽ có một phương thức gọi là SendData (chuỗi) nhưng bên trong thực hiện có thể gọi n phương thức trên các gói con m theo một thứ tự cụ thể để hoàn thành nhiệm vụ. Đây là sơ đồ trên trang wikipedia.

ví dụ: Dịch an example C++ và giữ nó nhỏ

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

Đây Library hư cấu Đối với WWW trong C++ là một mặt tiền mà thống nhất giao thức, mạng và phân tích các khía cạnh của vấn đề để tôi có thể tập trung vào trọng tâm chính của tôi lấy tài nguyên . Phương thức get ẩn/đóng gói/giữ-trong-một-nơi phức tạp (và trong một số trường hợp xấu) của HTTP, FTP và các giao thức khác nhau, yêu cầu-đáp ứng, quản lý kết nối, vv Ngoài ra nếu ngày mai những người sáng tạo của LWCPPSimple tìm thấy cách để làm cho get() nhanh gấp đôi, tôi nhận được các lợi ích hiệu suất miễn phí. Mã khách hàng của tôi không phải thay đổi.

+0

Chà. Tôi thích lời giải thích này. Ý tôi là, tôi biết Mặt tiền là gì, nhưng điều này thật tuyệt. –

+0

mừng bạn thích nó :) – Gishu

+0

Giải thích tuyệt vời, có thể hoạt động tốt với câu trả lời ví dụ về mã này. http://stackoverflow.com/questions/249581/explain-facade-pattern-with-c-example#249995 –

3

Tôi đã thực hiện tìm kiếm và thay thế trên ví dụ C#. Điều này có thể không giúp bạn, bởi vì nếu bạn hiểu C++ sau đó bạn sẽ có thể hiểu được C# vì nó sử dụng các cấu trúc tương tự và từ khóa (lớp học, chức năng, không gian tên, công cộng, vv)

// "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; 
} 
2

Trong một nghĩa nào đó, Mặt tiền chỉ là một API cho các khách hàng muốn tương tác với một thứ gì đó ẩn.

Mặt tiền hữu ích khi trưng ra một API C đơn giản cho một thứ được triển khai trong C++ hoặc đơn giản hơn phức tạp hơn API. Hoặc để có được một rào cản cố định giữa một khách hàng và một thư viện khi thư viện cần phải trải qua nhiều cập nhật lặp đi lặp lại và bạn muốn ảnh hưởng đến khách hàng càng ít càng tốt. Ví dụ, nếu một thư viện dựa trên C cần phải được cập nhật nội bộ lên C++ hoặc một cái gì đó khác, hoặc chỉ hoán đổi cho một cái gì đó hoàn toàn khác, thì Facade là một lớp trung lưu tốt cho máy khách.

12
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; 
} 
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; } 
}; 

Class A sẽ không trực tiếp sử dụng bất kỳ phương pháp hoặc trực tiếp ảnh hưởng đến trạng thái của lớp C hay bất kỳ hệ thống phụ khác mà lớp B chứa. Chỉ có một hệ thống con được hiển thị ở đây bởi vì nó không quan trọng có bao nhiêu hệ thống con.

Các vấn đề liên quan