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

Bài viết được sự cho phép của tác giả Trần Hữu Cương

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 UML Diagram

  Hướng dẫn Java Design Pattern – DAO

  Hệ thống 23 mẫu Design Patterns

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.

bridge-pattern-2

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.

Tham khảo việc làm Fresher Java mới nhất trên TopDev

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

}

Xem tin tuyển dụng Java mới nhất trên TopDev

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!

Bài viết gốc được đăng tải tại stackjava.com

Xem thêm:

Xem thêm công việc CNTT hấp dẫn trên TopDev