... hầu hết các trang web chỉ ra rằng trình dàn xếp "thêm chức năng" ...
Các mặt tiền chỉ cho thấy nhiều chức năng hiện có từ một góc độ khác nhau.
Các trung gian "thêm" chức năng vì nó kết hợp chức năng hiện có khác nhau để tạo ra một cái mới.
Lấy ví dụ sau:
Bạn có một hệ thống ghi nhật ký. Từ hệ thống ghi nhật ký đó, bạn có thể đăng nhập vào tệp, vào ổ cắm hoặc vào cơ sở dữ liệu.
Sử dụng mẫu thiết kế mặt tiền, bạn sẽ "ẩn" tất cả các mối quan hệ khỏi chức năng hiện có đằng sau một "giao diện" duy nhất mà mặt tiền lộ ra.
Mã khách hàng:
Logger logger = new Logger();
logger.initLogger("someLogger");
logger.debug("message");
Việc thực hiện có thể liên quan đến sự tương tác của nhiều đối tượng. Nhưng cuối cùng, chức năng đã tồn tại. Có thể phương pháp "gỡ lỗi" được thực hiện như sau:
Thực hiện:
class Logger {
private LoggerImpl internalLogger;
private LoggerManager manager;
public void initLogger( String loggerName ) {
this.internalLogger = manager.getLogger( loggerName );
}
public void debug( String message ) {
this.internalLogger.debug( message );
}
}
Chức năng đã tồn tại. Mặt tiền chỉ che giấu nó. Trong trường hợp giả định này, LoggerManager xử lý việc tạo trình ghi chính xác và LoggerImpl là một đối tượng gói-riêng có phương thức "gỡ lỗi". Bằng cách này, Mặt tiền không thêm chức năng mà chỉ là ủy quyền cho một số đối tượng hiện có.
Mặt khác, trình hòa giải thêm chức năng mới bằng cách kết hợp các đối tượng khác nhau.
Cùng một mã Khách hàng:
Logger logger = new Logger();
logger.initLogger("someLogger");
logger.debug("message");
Thực hiện:
class Logger {
private java.io.PrintStream out;
private java.net.Socket client;
private java.sql.Connection dbConnection;
private String loggerName;
public void initLogger( String loggerName ) {
this.loggerName = loggerName;
if ( loggerName == "someLogger" ) {
out = new PrintStream( new File("app.log"));
} else if ( loggerName == "serverLog" ) {
client = new Socket("127.0.0.1", 1234 );
} else if( loggerName == "dblog") {
dbConnection = Class.forName()... .
}
}
public void debug( String message ) {
if ( loggerName == "someLogger" ) {
out.println( message );
} else if ( loggerName == "serverLog" ) {
ObjectOutputStrewam oos =
new ObjectOutputStrewam( client.getOutputStream());
oos.writeObject( message );
} else if( loggerName == "dblog") {
Pstmt pstmt = dbConnection.prepareStatment( LOG_SQL );
pstmt.setParameter(1, message );
pstmt.executeUpdate();
dbConnection.commit();
}
}
}
Trong mã này, người trung gian là người chứa logic nghiệp vụ để tạo một "kênh" thích hợp để ghi nhật ký và cũng để thực hiện đăng nhập vào kênh đó. Người dàn xếp đang "tạo" chức năng.
Tất nhiên, có những cách tốt hơn để triển khai điều này bằng cách sử dụng tính đa hình, nhưng vấn đề ở đây là cho thấy cách người dàn xếp "thêm" chức năng mới bằng cách kết hợp chức năng hiện có (trong mẫu của tôi không hiển thị rất tiếc) nhưng hãy tưởng tượng người dàn xếp, hãy đọc từ cơ sở dữ liệu máy chủ lưu trữ từ xa nơi đăng nhập, sau đó tạo một máy khách và cuối cùng viết cho máy khách đó in luồng thông báo nhật ký. Bằng cách này, người hòa giải sẽ "hòa giải" giữa các đối tượng khác nhau.
Cuối cùng, mặt tiền là một mẫu cấu trúc, nghĩa là nó mô tả thành phần của các đối tượng, trong khi trung gian là một hành vi, tức là nó mô tả cách các đối tượng tương tác.
Tôi hi vọng cái này giúp được.