Bridge Pattern trong Java – Code ví dụ Composite Pattern

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.

Bridge Pattern trong Java – Code ví dụ Composite Pattern

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:

https://en.wikipedia.org/wiki/Bridge_pattern

stackjava.com