Bài viết này chúng ta sẽ cùng tìm hiểu về 1 số design pattern hữu ích trong iOS.

Strategy

Strategy pattern cho phép chọn một thuật toán trong thời gian chạy. Thay vì thực hiện các thuật toán đơn lẻ một cách trực tiếp, code sẽ nhận biết được từng loại thông qua hàm khởi tạo và sau đó thực hiện hành động tương ứng.

Chúng ta thường sử dụng các thuật tonas khác nhau chỉ quan tâm đến thời gian chạy mà không quan tâm đến làm sao để thực hiện chúng.

Ví dụ đơn giản, thuật toán cần đối tượng biết làm sao để fly. Class Duck biết làm sao để “fly” và class Rocket cũng vậy. Thuật toán của chúng ta không quan tâm nếu thực hiện thì sẽ cần một đôi cánh hay gas mà chỉ cần biết chúng có thể bay được hay không.

Vấn đề được giải quyết khi sử dụng strategy

Trong project này chúng ta cần nhận viewController nhưng chúng ta cũng cần chúng có một số hành vi được xác định trước. Điều này thì Strategy pattern có thể thực hiện rất tốt. Một ViewController chung trong mobile app là để Login. Do đó chỉ cần tạo protocol để xác định LoginViewController có những action gì. Có nghĩa là LoginViewController nằm trong project nhưng chúng ta không cần quang tâm về UI nếu nó có một tableView hay animation hoặc một phương thức validation nào đó. Nhưng chúng ta cần nó biết thực hiện login.

Factory

Factory Method Pattern giải quyết vấn đề khởi tạo đối tượng mà không cần phải biết cụ thể đối tượng sẽ được tạo ra như thế nào.

Factory Pattern rất hữu ích khi bạn tạo đối tượng tại thời điểm runtime. Do vậy nếu người dùng muốn một cheese pizza bạn sẽ tạo CheesePizza(), nếu muốn peperoni thì tương tự sẽ tạo PeperoniPizza()

Vấn đề được giải quyết khi sử dụng factory

Trong một dự án tương tự, bạn sử dụng factory pattern để có thể tạo ra đối tượng tại thời điểm runtime bằng cách truyền cho chúng những gì chúng cần.

Chúng ta cần truyền một LoginViewController cái mà có thể được tạo ra sử dụng các cách tiếp cận khác nhau như Storyboards, xib hoặc coded. Chúng ta có factory instance, bằng một tham số truyền vào có thể làm thay đổi cách tạo ra đói tượng đó.

Với instance của Factory, chúng ta chỉ cần gọi method build. Factory này có thể được instance của ViewCodedLoginViewControllerFactory hoặc StoryboardLoginViewControllerFactory chúng ta không thực sự quan tâm, mà chỉ cần nó thực hiện build method và trả về một đối tượng LoginViewController là được.

Decorator

Decorator pattern cho phép hành vi được thêm vào một đối tượng riêng lẻ, tĩnh hoặc động, mà không ảnh hưởng đến hành vi của các đối tượng khác trong cùng một lớp.

Một ví dụ đơn giản, Coffee shop muốn thêm whip cream vào coffee và tính toán giá mới và mô tả dựa trên đồ uống.

Vấn đề được giải quyết khi sử dụng decorator

Chúng ta cần API version khác nhau cho mỗi lần gọi service, điều này có thể có nhiều cách khác nhau để xử lý nhưng chúng ta sử dụng pattern này để hteme một Header custom cho Request. Với cách tiếp cận này, chúng ta vừa có thể hoàn thành xong công việc hiện tại, mà trong tương lại, một lần gọi API lại thêm tham số khác vào header thì ok.

Chúng ta cũng cần để filter kết quả của request. Cái mà có thể được thực hiện khi tạo một method mới, hoặc thay đổi request của bạn. Chúng tôi quyết định sử dụng Decorator để thêm vào hành vi này bởi vì service của chúng ta đã được sử udngj trong một class khác và chúng ta muốn thay đối ít nhất một số dòng ít nhất có thể.

Adapter

Adapter pattern là một software design pattern cho phép giao diện của class đã có được sử dụng như giao diện khác. Nó thường được sử dụng để tạo class có sẵn làm việc với class khác mà không phải sửa source code

Chúng ta hãy tưởng tượn adapter giống như một bộ chuyển đổi trên thực tế. Giả dụ bạ cần Nintendo 64 có video tổng hợp để làm đầu ra cho TV 4k của bạn. Do đó bạn cần một bộ chuyển đổi Composite-HDMI.

Vấn đề được giải quyết khi sử dụng adapter

Bạn cần 4 số cuối của một Card và cũng tương thích với PKPaymentPass. Nói cách khác, tạo một adapter để trả về một PKPaymentPass làm một thể hiện của Card.

Nhưng chúng ta cũng cần mix các pattern để tạo ra code có tính dùng lại và tính duy trì. Ví dụ, mix adapter với strategy pattern. Chúng ta không thực sự cần Card object mà chúng ta chỉ cần lastNumbers vậy tại sao chúng ta không tạo protocol để thực hiện chngs và tích hợp PKPaymentPass, Card và bất kì Object khác mà bạn có thể cần.

Tổng kết

Design pattern giúp chúng ta rất nhiều trong việc sử dụng lại code, tiết kiệm thời gian khi cần thay đổi một số tính năng trong code và một số tác vụ cũng dễ dàng sử dụng.

Link tham khảo: https://medium.com/cocoaacademymag/real-world-ios-design-patterns-3e5aad172094

) self.request.request(method: method, data: data, header: mutableHeader, completion: completion) } } let v1Request: Request = MyHeader(request: MyRequest(), apiVersion: .v1) let standardRequest: Request = MyHeader(request: MyRequest())

We also need to filter the result of the request. What can be done when creating a new method, or changing your request. We decided to use Decorator to add this behavior because our service has been used in another class and we want to change at least some of the least possible lines.

Adapter

Adapter pattern is a software design pattern that allows the interface of the existing class to be used as another interface. It is often used to create an existing class that works with another class without modifying the source code

Let’s think of an adapter as a practical converter. Suppose you need Nintendo 64 to have a composite video to be the output for your 4k TV. Therefore you need a Composite-HDMI converter.

The problem is solved when using an adapter

You need the last 4 digits of a Card and are also compatible with PKPaymentPass. In other words, create an adapter to return a PKPaymentPass as an instance of the Card.

But we also need to mix patterns to create reusable code and maintainability. For example, mix adapter with strategy pattern. We don’t really need a Card object, we just need to lastNumbers so why don’t we create a protocol to implement and integrate PKPaymentPass, Card and any other Objects you may need.

summary

Design patterns help us a lot in reusing code, saving time when changing some features in code and some tasks are also easy to use.

Link to reference: https://medium.com/cocoaacademymag/real-world-ios-design-patterns-3e5aad172094