Giới thiệu về Design Pattern

      No Comments on Giới thiệu về Design Pattern

Trong phần này chúng ta sẽ học  các lợi ích của design pattern, lướt qua 1 vài điểm quan trọng và cuối cùng là tìm hiểu “How one pattern works?”. Cách tốt nhất để sử dụng design pattern là ghi nhớ các các mẫu và nhận ra nơi mà bạn có thể áp dung chúng, điều này không dễ dàng cần thời gian không nhỏ để luyện tập.

Chúng ta bắt đầu với app SimUDuck.

Joe làm việc rất thành công trong 1 công ty chuyên cung cấp game mô phỏng vịt: SimUDuck. Game có thể mô phỏng rất nhiều loai vịt cùng với hành động bơi lội và tiếng kêu của chúng. Hãy xem thiết kế đầu tiên là Joe nghĩ tới là thế nào:

Sau khi tung ra phiên bản đầu tiên trò chơi đã gặt hái được thành công lớn. Nhưng không lâu sau đó dưới áp lực của đối thử cạnh tranh công ty cần làm điều gì ấn tượng hơn nữa. Vậy là họ quyết định cho vịt bay “fly”. Joe đưa ra ý kiến “Tôi sẽ thêm method Fly vào abstract class Duck sau đó thì mọi loại vịt kế thừa từ Duck đều có thể bay”.

Sau khi implement ý tưởng của mình. Joe tự tin đưa cho sếp mang đi giới thiệu tai hội nghị cổ đông. Sếp của Joe rất mất mặt với mọi người vì 1 con vịt cao su (Rubber Duck) lại có thể bay. Joe đã thêm 1 method vào superclass mà không phù hợp với subclass.

Joe lại tiếp tục đưa ra giải pháp nếu RubberDuck không thể kêu và bay thì tôi sẽ override lại method quack() và fly(). Joe rất tư tin với giải pháp mới vì nó đã tuân thủ đúng nguyên tắc inheritance- Kế thừa. Thế nhưng sau vị cao sư rubberDuck, công ty lai tung ra giống vit mới woodenDuck ( vịt gỗ). Vịt gỗ cũng không biết bay và cũng chẳng thể kêu. Dĩ nhiên muốn implement vịt gỗ ta lại phải override lại quakc() và fly().

Đến lúc này Joe bắt đầu nghĩ về những bất lợi khi sử dụng kế thừa để implement hành động của những con vịt. Có thể kể ra 1 số bất lợi như sau:

  • Khó có thể thay đổi behavior của Vịt trong lúc runtime. Ví dụ nếu đã tạo 1 rubberDuck thì rất khó có thể khiến rubberDuck này có thể bay hoặc kêu.

Leave a Reply

Your email address will not be published. Required fields are marked *