Bridge Pattern trong Java – Code ví dụ Composite Pattern.
1. Bridge Pattern là gì?
Bridge Pattern là một mẫu cấu trúc (Structural Pattern).
Bridge Pattern được dùng khi có sự phân cấp giao diện trong cả thành phần interface lẫn thành phần implement nó.
2. Bridge Pattern UML Diagram.
3. Ví dụ.
Ta có 1 tin nhắn với 2 cách log là ghi ra file và show ra màn hình mỗi cách lại được thực hiện làm 2 kiểu là thực hiện với kết quả là text rõ hoặc text đã được mã hóa.
Message: là 1 lớp trừu tượng khai báo chức năng log
MessageLogger: là 1 interface thực thi chức năng log của Message
ConsoleLogger: thừa kế MessageLogger, có chức năng show message ra console
FileLogger: thừa kế MessageLogger, có chức năng ghi message vào file
TextMessage và EncryptedMessage: thừa kế Message, quyết định xem việc log tin nhắn là text rõ hoặc text đã được mã hóa.
Code ví dụ:
MessageLogger.java
public interface MessageLogger { public void log(String msg); }
ConsoleLogger.java
public class ConsoleLogger implements MessageLogger { @Override public void log(String msg) { System.out.println(msg); } }
FileLogger.java
public class FileLogger implements MessageLogger { @Override public void log(String msg) { // viet ham ghi ra file log.txt try { FileWriter fw = new FileWriter(new File("log.txt"), true); fw.append((char) 10); fw.write(msg); fw.close(); } catch (Exception ex) { System.out.println("loi log trong FileLogger: " + ex); } } }
Message.java
public abstract class Message { MessageLogger messageLogger; public Message() { } public Message(MessageLogger messageLogger) { this.messageLogger = messageLogger; } public abstract void log(String msg); }
TextMessage.java
public class TextMessage extends Message { public TextMessage() { } public TextMessage(MessageLogger messageLogger) { super(messageLogger); } public MessageLogger getMessageLogger() { return messageLogger; } public void setMessageLogger(MessageLogger messageLogger) { this.messageLogger = messageLogger; } public String preProcess(String str) { return str; } @Override public void log(String msg) { this.messageLogger.log(preProcess(msg)); } }
EncryptedMessage.java
public class EncryptedMessage extends Message { public EncryptedMessage() { } public EncryptedMessage(MessageLogger messageLogger) { super(messageLogger); } public MessageLogger getMessageLogger() { return messageLogger; } public void setMessageLogger(MessageLogger messageLogger) { this.messageLogger = messageLogger; } public String preProcess(String str) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] messageDigest = md.digest(str.getBytes()); BigInteger number = new BigInteger(1, messageDigest); String hashtext = number.toString(16); while (hashtext.length() < 32) { hashtext = "0" + hashtext; } return hashtext; } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } @Override public void log(String msg) { this.messageLogger.log(preProcess(msg)); } }
Demo:
public class MainApp { public static void main(String[] args) { // chọn log kiểu show ra console MessageLogger messageLogger = new ConsoleLogger(); // chọn cách thức hiển thị kiểu mã hóa Message message1 = new EncryptedMessage(messageLogger); // chọn cách thức hiển thị kiểu text rõ Message message2 = new TextMessage(messageLogger); // thực thi phương thức log message1.log("stackjava.com"); message2.log("stackjava.com"); } }
Kết quả:
29c4fdeeb3e62a969f69ad4601589fac stackjava.com
Okay, Done!
Thanks các bạn đã theo dõi. Xem thêm các ví dụ khác về design pattern tại: https://stackjava.com/category/design-pattern
References: