Tìm hiểu về Bridge Pattern

Trong việc thiết kế ứng dụng, một mẫu thiết kế (design pattern) là một giải pháp để tối ưu việc một vấn đề thường xuyên được xảy ra và lặp đi lặp lại. Các mẫu design pattern có thể giúp cho lập trình viên đẩy nhanh quá trình phát triển bằng cách cung cấp các mô hình phát triển đã được kiểm nghiệm và cho tính hiệu quả cao. Bài viết này chúng ta sẽ tìm hiểu về 1 mẫu design pattern trong số đó – Bridge Pattern.

  1.   Định nghĩa Bride pattern:
    Là một pattern trong nhóm cấu trúc (Structural pattern) nhằm để tách abstraction (trừu tượng) ra khỏi implement (triển khai) của nó, giúp cho 2 thành phần này có thể hoạt động một cách độc lập.
    Trường hợp khi  thành phần trừu tượng thay đổi thì không làm thay đổi các thành phần triển khai của nó.
  2.   Lý do nên dùng Bride pattern:
    Dễ dàng bảo trì và hạn chế việc triển khai quá nhiều các lớp con: Giả sử với một chương trình nhận diện hình khối: Trong chương trình này ta có 2 khối là hình tròn và hình vuông.
    Ngoài ra ta có 2 màu là màu đỏ và màu xanh.
    Nếu áp dụng tính kế thừa trong chương trình thì phải thiết kế 4 lớp con: RedCircle, RedSquare, BlueCircle và BlueSquare.
    Trong trường hợp chương trình nhỏ thì kế thừa có thể xử lý và kiểm soát một cách dễ dàng nhưng khi giả dụ số hình khối và số màu sau được tăng lên 1, ta có 3 hình khối và 3 màu sắc thì số class con được thiết kế lúc này sẽ là 9 và tăng dần theo cấp số nhân.
  3. Giải pháp và cấu trúc:
    Tách phần trừu tượng (Abstraction) khỏi phần triển khai của nó (Implement) bằng cách đặt chúng trong các cấu trúc phân cấp được tách thành riêng biệt, việc này có thể giúp giảm thiểu các lớp con không cần thiết và giúp tăng tính bảo trì  Abstraction và các triển khai của nó dễ dàng hơn.
    Như trong biểu đồ trên ta thấy có 4 thành phần cấu tạo chính trong Bridge Pattern:

    Abstraction (abstract class):
    – Lớp abstract để định nghĩa abtraction trừu tượng và để maintain tham chiếu cho Implementor.RefinedAbstraction (normal class):
    – Class extend lớp abstractionImplementor (interface):
    – Interface để định nghĩa cho những lớp triển khai của nó.

    ConcreteImplementor (normal class):
    –  Lớp triển  khai của interface Implmentor

Ví dụ triển khai:


//Implementor
trait DrawingAPI {
  def drawCircle(x: Double, y: Double, radius: Double)
}
//ConcreteImplementor 
class DrawingAPI1 extends DrawingAPI {
  def drawCircle(x: Double, y: Double, radius: Double) = println(s"API #1 $x $y $radius")
}

//ConcreteImplementor
class DrawingAPI2 extends DrawingAPI {
  def drawCircle(x: Double, y: Double, radius: Double) = println(s"API #2 $x $y $radius")
}

//Abstractionabstract 
class Shape(drawingAPI: DrawingAPI) {
  def draw()
  def resizePercentage(pct: Double)
}

//RefinedAbstraction 
class CircleShape(x: Double, y: Double, var radius: Double, drawingAPI: DrawingAPI) extends Shape(drawingAPI: DrawingAPI) {
  def draw() = drawingAPI.drawCircle(x, y, radius)
  def resizePercentage(pct: Double) { radius *= pct }
}

object BridgePattern {
  def main(args: Array[String]) {
    Seq (
	new CircleShape(1, 3, 5, new DrawingAPI1),
	new CircleShape(4, 5, 6, new DrawingAPI2)
    ) foreach { x =>
        x.resizePercentage(3)
        x.draw()			
      }	
  }
}

>>Result : API #1 1.0 3.0 15.0  API #2 4.0 5.0 18.0

Add a Comment

Scroll Up