Mẫu thiết kế mặt tiền là gì?


191

Mặt tiền có phải là một lớp chứa rất nhiều lớp khác không?

Điều gì làm cho nó một mô hình thiết kế? Đối với tôi, nó giống như một lớp học bình thường.

Bạn có thể giải thích cho tôi mẫu mặt tiền này ?


7
Mỗi mẫu thiết kế là trong thực hiện của nó một loạt các lớp.
Felix Kling

1
Mẫu mặt tiền tạo ra một giao diện dễ sử dụng bằng cách ẩn nhiều giao diện trong một lớp. Bài viết này có nhiều chi tiết hơn .
dùng3199690

cũng giải thích trong bài này programmerzdojo.com/java-tutorials/...
rishi007bansod

Phải đưa ra ý kiến ​​này vì nó "không cho thấy nỗ lực nghiên cứu"
Roy Truelove

1
@RoyTruelove, làm những gì bạn muốn. Không quan tâm miễn là có câu trả lời hỗ trợ cho câu hỏi. Bất kỳ câu trả lời hỗ trợ cho câu hỏi?
kevin

Câu trả lời:


190

Một mẫu thiết kế là một cách phổ biến để giải quyết vấn đề định kỳ. Các lớp trong tất cả các mẫu thiết kế chỉ là các lớp bình thường. Điều quan trọng là cách chúng được cấu trúc và cách chúng làm việc cùng nhau để giải quyết một vấn đề nhất định theo cách tốt nhất có thể.

Mẫu thiết kế Facade đơn giản hóa giao diện thành một hệ thống phức tạp; bởi vì nó thường bao gồm tất cả các lớp tạo nên các hệ thống con của hệ thống phức tạp.

Mặt tiền che chắn người dùng khỏi các chi tiết phức tạp của hệ thống và cung cấp cho họ một simplified viewtrong số đó là easy to use. Nó cũng decoupleslà mã sử dụng hệ thống từ các chi tiết của các hệ thống con, giúp việc sửa đổi hệ thống sau này dễ dàng hơn.

http://www.dofactory.com/Potypes/PotypeFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

Ngoài ra, điều quan trọng trong khi học các mẫu thiết kế là có thể nhận ra mẫu nào phù hợp với vấn đề nhất định của bạn và sau đó sử dụng nó một cách thích hợp. Đó là một điều rất phổ biến để sử dụng sai một mô hình hoặc cố gắng phù hợp với một số vấn đề chỉ vì bạn biết nó. Hãy nhận biết những cạm bẫy trong khi học \ sử dụng các mẫu thiết kế.


9
@kevin: Biết khi nào nên sử dụng chúng là phần khó nhất. Về lý thuyết, các mẫu có thể dễ, nhưng imo chúng khó thực hành. Bạn chỉ có thể học điều này là kinh nghiệm, tức là. mã hóa, mã hóa, mã hóa.
Felix Kling

Mẫu thiết kế mặt tiền cũng được sử dụng để ẩn việc triển khai lớp chi tiết và cung cấp api công cộng một cách an toàn.
yebw

29
$ in jquery chỉ là ví dụ đơn giản về mẫu thiết kế mặt tiền cung cấp giao diện đơn giản và che giấu mọi sự phức tạp
Ajay Beniwal

cho một số người tìm kiếm một mẫu thiết kế mặt tiền với ví dụ thế giới thực. tôi đã xem qua trang phục ngắn youtube này. hy vọng youtu.be/dLjJo2v2re8
Sankar ganesh

chúng ta có thể có nhiều hơn một lớp mặt tiền cho một hệ thống khi ứng dụng phát triển lớn hơn không?
Jeeva Jsb

99

Wikipedia có một ví dụ tuyệt vời về mẫu Mặt tiền.

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

6
Đây là một ví dụ tốt. Một khách hàng cần có khả năng ghép tất cả các bước trong một mặt tiền nếu họ cũng chọn, không có gì phải được ẩn bằng các phương thức riêng tư.
Cướp

2
Imho đây không phải là một ví dụ tốt vì nó không nhấn mạnh trường hợp sử dụng. Ví dụ chỉ cho thấy, như TO đã nói, một lớp học thông thường. Sự liên kết với phần cứng là một thành phần. Có thể quá mức cho ví dụ trên wiki, nhưng sử dụng tiêm phụ thuộc thay vì kích hoạt các mô hình con sẽ nhấn mạnh ý định và có thể tránh sự nhầm lẫn của TO.
ManuelSchneid3r

Đây là một ví dụ tuyệt vời vì nó chỉ gói gọn hàng ngàn từ một cách ngắn gọn để hiểu chính khái niệm này. Phần còn lại chỉ là các chi tiết xung quanh các kịch bản khác nhau mà người ta có thể có (tất nhiên một mẫu thiết kế không bao giờ có thể bao gồm từng kịch bản).
Syed

41

Như đã giải thích trong câu trả lời trước, nó cung cấp một giao diện đơn giản cho khách hàng tiêu thụ. Ví dụ: "xem ESPN" là chức năng dự định. Nhưng nó bao gồm một số bước như:

  1. Bật TV nếu cần thiết;
  2. Kiểm tra chức năng vệ tinh / cáp;
  3. Chuyển sang ESPN nếu được yêu cầu.

Nhưng mặt tiền sẽ đơn giản hóa điều này và chỉ cung cấp chức năng "xem ESPN" cho khách hàng.


29

Facade che giấu sự phức tạp của hệ thống và cung cấp giao diện cho khách hàng từ nơi khách hàng có thể truy cập hệ thống.

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }

Có được phép cho các hệ thống phụ giao tiếp với nhau mà không cần thông qua OrderFacadekhông? Trong ví dụ của bạn, giữa PaymentInventory?
Isuru

19

Một lời giải thích ngắn gọn và đơn giản:

  • Mẫu mặt tiền cung cấp một giao diện hợp nhất cho một bộ (các) giao diện trong hệ thống con.
  • Facade định nghĩa một giao diện cấp cao hơn giúp hệ thống con dễ sử dụng hơn.

Cố gắng hiểu kịch bản có và không có Façade:
Nếu bạn muốn chuyển tiền từ accout1 sang tài khoản2 thì hai hệ thống con sẽ được gọi là, rút ​​tiền từ tài khoản1 và gửi vào tài khoản2.

có và không có mặt tiền


Giải thích đơn giản và rõ ràng và ví dụ, cảm ơn! Bạn cũng có thể giải thích những gì định nghĩa một hệ thống con? Khi hệ thống con có thể bao gồm các lớp / hàm tương đối không liên quan, định nghĩa của bạn áp dụng cho hầu hết mọi lớp. Các lớp của hệ thống con phải liên quan rất chặt chẽ, ví dụ như tạo thành một mô-đun hoặc thư viện, mà người ta có thể gọi mặt tiền là mặt tiền?
Benni

@Benni Có, hệ thống con (nó sẽ là một lớp) có thể bao gồm các hàm tương đối không liên quan nhưng mặt tiền là một lớp nơi bạn quyết định nên gọi hàm cụ thể nào. Bạn muốn đặt một "gói tour", bạn chọn khách sạn, taxi, chuyến bay tại một địa điểm / hình thức sau đó mặt tiền gọi các chức năng của các lớp thích hợp khác nhau và trả về cho bạn kết quả cuối cùng. Phải không?
Arun Raaj

10

Một mặt tiền không nên được mô tả như là một lớp có chứa nhiều lớp khác. Thực tế nó là một giao diện cho các lớp này và sẽ làm cho việc sử dụng các lớp dễ dàng hơn nếu không lớp mặt tiền là vô dụng.


7

Về truy vấn của bạn:

Có phải Facade là một lớp chứa rất nhiều lớp khác?

Đúng. Nó là một trình bao bọc cho nhiều hệ thống phụ trong ứng dụng.

Điều gì làm cho nó một mô hình thiết kế? Đối với tôi, nó giống như một lớp học bình thường

Tất cả các mẫu thiết kế cũng là các lớp bình thường. @ Unmesh Kondolikar đã trả lời đúng câu hỏi này.

Bạn có thể giải thích cho tôi về Mặt tiền này, tôi chưa quen với các mẫu thiết kế.

Theo GoF, mẫu thiết kế Facade được xác định là:

Cung cấp một giao diện hợp nhất cho một tập hợp các giao diện trong một hệ thống con. Mẫu mặt tiền xác định giao diện cấp cao hơn giúp hệ thống con dễ sử dụng hơn

Mẫu mặt tiền thường được sử dụng khi:

  1. Một giao diện đơn giản là cần thiết để truy cập vào một hệ thống phức tạp.
  2. Các tóm tắt và triển khai của một hệ thống con được kết hợp chặt chẽ.
  3. Cần một điểm vào cho mỗi cấp độ của phần mềm lớp.
  4. Hệ thống rất phức tạp hoặc khó hiểu.

Hãy lấy một ví dụ từ thực sự của trang web Cleartrip .

Trang web này cung cấp các tùy chọn để đặt

  1. Chuyến bay
  2. Nhiều khách sạn
  3. Chuyến bay + Khách sạn

Đoạn mã:

import java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

Giải trình:

  1. FlightBooking, TrainBooking and HotelBooking là các hệ thống con khác nhau của hệ thống lớn: TravelFacade

  2. TravelFacade cung cấp một giao diện đơn giản để đặt một trong các tùy chọn dưới đây

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. sách API từ TravelFacade gọi nội bộ bên dưới API của các hệ thống phụ

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. Theo cách này, TravelFacadecung cấp API đơn giản và dễ dàng hơn khi không có API hệ thống phụ.

Takeaways chính: (từ journaldev bài viết của Pankaj Kumar )

  1. Mẫu mặt tiền giống như một trợ giúp cho các ứng dụng khách
  2. Mô hình mặt tiền có thể được áp dụng tại bất kỳ điểm phát triển nào, thường là khi số lượng giao diện tăng lên và hệ thống được biên dịch x .
  3. Giao diện hệ thống con không biết về Facade và chúng không nên có bất kỳ tham chiếu nào về giao diện Facade
  4. Mẫu mặt tiền nên được áp dụng cho loại giao diện tương tự , mục đích của nó là cung cấp một giao diện duy nhất thay vì nhiều giao diện thực hiện loại công việc tương tự

Có một cái nhìn vào bài viết chua quá để hiểu rõ hơn.


6

Mẫu mặt tiền là một gói của nhiều giao diện khác trong kết quả để tạo ra một giao diện đơn giản hơn.

Các mẫu thiết kế rất hữu ích vì chúng giải quyết các vấn đề định kỳ và nói chung đơn giản hóa mã. Trong một nhóm các nhà phát triển đồng ý sử dụng các mẫu tương tự, nó cải thiện hiệu quả và sự hiểu biết khi duy trì mã của nhau.

Hãy thử đọc về nhiều mẫu hơn:

Mẫu mặt tiền: http://www.dofactory.com/Potypes/PotypeFacade.aspx#_elf1

hoặc nói chung hơn: http://www.dofactory.com/Potypes/Potypes.aspx


nileshgule.com/2012/07/facade-design-potype.html Tôi đã cố gắng mô tả mẫu thiết kế Mặt tiền ở đây với một ví dụ về quy trình xác minh khoản vay mua nhà.
Nilesh Gule

6

Một cách sử dụng bổ sung mô hình Façade có thể là để giảm thời gian học tập của nhóm của bạn. Tôi sẽ cho bạn một ví dụ:

Giả sử rằng ứng dụng của bạn cần tương tác với MS Excel bằng cách sử dụng mô hình đối tượng COM do Excel cung cấp. Một trong các thành viên trong nhóm của bạn biết tất cả các API Excel và anh ta tạo Mặt tiền trên đầu trang, đáp ứng tất cả các kịch bản cơ bản của ứng dụng. Không có thành viên nào khác trong nhóm cần dành thời gian cho việc học API Excel. Nhóm có thể sử dụng mặt tiền mà không cần biết nội bộ hoặc tất cả các đối tượng MS Excel có liên quan đến việc hoàn thành một kịch bản. Không phải nó thật tuyệt sao?

Do đó, nó cung cấp một giao diện đơn giản và thống nhất trên một hệ thống con phức tạp.


5

Một ví dụ khác về mặt tiền: giả sử ứng dụng của bạn kết nối với cơ sở dữ liệu và hiển thị kết quả trên giao diện người dùng. Bạn có thể sử dụng mặt tiền để làm cho ứng dụng của bạn có thể định cấu hình được, như khi chạy bằng cơ sở dữ liệu hoặc với các đối tượng giả. Vì vậy, bạn sẽ thực hiện tất cả các cuộc gọi cơ sở dữ liệu đến lớp mặt tiền, nơi nó sẽ đọc cấu hình ứng dụng và quyết định kích hoạt truy vấn db hoặc trả về đối tượng giả. cách này ứng dụng trở thành độc lập db trong trường hợp db không có sẵn.


5

Một mặt tiền cho thấy các chức năng đơn giản được gọi là chủ yếu và việc triển khai che giấu sự phức tạp mà khách hàng sẽ phải giải quyết. Nói chung, việc triển khai sử dụng nhiều gói, lớp và chức năng trong đó. Mặt tiền được viết tốt làm cho việc truy cập trực tiếp của các lớp khác trở nên hiếm. Ví dụ khi tôi truy cập ATM và rút một số tiền. ATM ẩn cho dù nó đang đi thẳng đến ngân hàng thuộc sở hữu hay nó sẽ đi qua một mạng được đàm phán cho một ngân hàng bên ngoài. ATM hoạt động giống như một mặt tiền tiêu thụ nhiều thiết bị và hệ thống phụ mà với tư cách là khách hàng tôi không phải đối phó trực tiếp.


5

Có một ví dụ thực tế rất tốt về mẫu - Động cơ khởi động xe .

Là tài xế, chúng tôi chỉ cần bật chìa khóa và xe bắt đầu. Càng đơn giản càng tốt. Đằng sau hậu trường, nhiều hệ thống xe hơi khác có liên quan (như pin, động cơ, nhiên liệu, v.v.), để chiếc xe khởi động thành công, nhưng chúng được ẩn đằng sau bộ khởi động.

Như bạn có thể thấy, người khởi động xe là Mặt tiền. Nó cho chúng ta dễ dàng sử dụng giao diện, mà không phải lo lắng về sự phức tạp của tất cả các hệ thống xe hơi khác.

Hãy tóm tắt:

Mẫu Facade đơn giản hóa và che giấu sự phức tạp của các khối mã hoặc API lớn, cung cấp giao diện sạch hơn, dễ hiểu và dễ sử dụng.


4

Mặt tiền là một lớp có mức chức năng nằm giữa bộ công cụ và ứng dụng hoàn chỉnh, cung cấp cách sử dụng đơn giản các lớp trong gói hoặc hệ thống con. Mục đích của mẫu Mặt tiền là cung cấp giao diện giúp hệ thống con dễ sử dụng. - Trích xuất từ cuốn sách Các mẫu thiết kế trong C #.


4

Facade thảo luận về việc đóng gói một hệ thống con phức tạp trong một đối tượng giao diện duy nhất. Điều này làm giảm đường cong học tập cần thiết để tận dụng thành công hệ thống con. Nó cũng thúc đẩy việc tách hệ thống con khỏi nhiều khách hàng tiềm năng của nó. Mặt khác, nếu Mặt tiền là điểm truy cập duy nhất cho hệ thống con, nó sẽ giới hạn các tính năng và tính linh hoạt mà "người dùng quyền lực" có thể cần.

Nguồn: https://sourcemaking.com/design_potypes/facade


3

Một mẫu thiết kế là một giải pháp tái sử dụng chung cho một vấn đề thường xảy ra trong một bối cảnh nhất định trong thiết kế phần mềm.

Mẫu thiết kế Facade là một mẫu cấu trúc vì nó xác định cách tạo mối quan hệ giữa các lớp hoặc các thực thể. Mẫu thiết kế mặt tiền được sử dụng để xác định giao diện đơn giản hóa cho một hệ thống con phức tạp hơn.

Mẫu mặt tiền là lý tưởng khi làm việc với một số lượng lớn các lớp phụ thuộc lẫn nhau hoặc với các lớp yêu cầu sử dụng nhiều phương thức, đặc biệt khi chúng phức tạp để sử dụng hoặc khó hiểu. Lớp mặt tiền là một "trình bao bọc" chứa một tập hợp các thành viên dễ hiểu và dễ sử dụng. Các thành viên này truy cập hệ thống con thay mặt cho người dùng mặt tiền, ẩn các chi tiết thực hiện.

Mẫu thiết kế mặt tiền đặc biệt hữu ích khi gói các hệ thống con được thiết kế kém nhưng không thể được cấu trúc lại do mã nguồn không có sẵn hoặc giao diện hiện có được sử dụng rộng rãi. Đôi khi bạn có thể quyết định triển khai nhiều mặt tiền để cung cấp các tập hợp chức năng cho các mục đích khác nhau.

Một ví dụ sử dụng mẫu mặt tiền là để tích hợp một trang web với một ứng dụng kinh doanh. Phần mềm hiện có có thể bao gồm một lượng lớn logic kinh doanh phải được truy cập theo một cách cụ thể. Trang web có thể chỉ yêu cầu quyền truy cập hạn chế vào logic kinh doanh này. Ví dụ, trang web có thể cần hiển thị liệu một mặt hàng để bán đã đạt đến một mức độ hạn chế của chứng khoán. Phương thức IsLowStock của lớp mặt tiền có thể trả về giá trị Boolean để biểu thị điều này. Đằng sau hậu trường, phương pháp này có thể che giấu sự phức tạp của việc xử lý cổ phiếu vật lý hiện tại, cổ phiếu đến, các mặt hàng được phân bổ và mức cổ phiếu thấp cho từng mặt hàng.


2

Tất cả các mẫu thiết kế là một số lớp được sắp xếp theo cách này hay cách khác phù hợp với một ứng dụng cụ thể. Mục đích của mô hình mặt tiền là để che giấu sự phức tạp của một hoạt động hoặc hoạt động. Bạn có thể xem một ví dụ và tìm hiểu mô hình mặt tiền từ http://prec Chínhconcise.com /design_potypes/facade.php


2

Nó chỉ đơn giản là tạo ra một trình bao bọc để gọi nhiều phương thức. Bạn có một lớp A với phương thức x () và y () và lớp B với phương thức k () và z (). Bạn muốn gọi x, y, z cùng một lúc, để làm điều đó bằng cách sử dụng mẫu Facade, bạn chỉ cần tạo một lớp Facade và tạo một phương thức cho phép xyz (). Thay vì gọi riêng từng phương thức (x, y và z), bạn chỉ cần gọi phương thức trình bao (xyz ()) của lớp mặt tiền gọi các phương thức đó.

Mẫu tương tự là kho lưu trữ nhưng nó chủ yếu dành cho lớp truy cập dữ liệu.


1

Về cơ bản, nó là hệ thống giải phóng cửa sổ duy nhất. Bạn chỉ định bất kỳ công việc nào mà nó sẽ ủy quyền cho phương thức cụ thể trong một lớp khác.



1

Mẫu mặt tiền cung cấp một giao diện hợp nhất cho nhóm giao diện hệ thống con. Mặt tiền xác định một giao diện cấp cao, giúp đơn giản hóa công việc với hệ thống con.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.