Decoration Pattern!

Posted on December 22, 2006

0


Đóng lại để thay đổi

Mở ra để mở rộng

Trong khả năng của mình, hãy làm cho code của bạn đóng hết mức có thể để thay đổi và mở để mở rộng.

 

Một trong những vấn đề rất quan trọng trong quá trình phát triển phần mềm mà các lập trình viên và nhà phát triển phải lưu ý đến đó là nắm bắt được sự thay đổi, đó là lý do tại vì sao design pattern lại được trình bày đến đầu tiên. Đặc biệt design pattern giúp bạn nắm bắt những thay đổi khi mà bạn phải thay đổi code của mình thích nghi với những điều kiện mới và không lường trước được. Kinh nghiệm của những lập trình viên cho thấy chúng ta sử dụng phần lớn thời gian để mở rộng và thay đổi code hơn là dành thời gian cho việc tạo ra nó.

Decorator pattern rất đơn giản, nó cho phép chúng ta viết code và bỏ qua những sự thay đổi khi mà bạn cần phải mở rộng thêm tính năng.

Chúng ta hãy cùng xem một ví dụ sau: bạn làm việc trong một dự án làm phần mềm bán máy tính, chúng ta cần tạo ra đối tượng Computer để lưu giữ thông tin của máy tính, sau đây là code java trình bày cho lớp Computer

public class Computer {

public Computer() {

}

public String description() {

return “Computer include: monitor”;

}

}

Bạn hãy nhìn vào phương thức description(), chúng ta sử dụng phương thức đó để mô tả chiếc máy tính của chúng ta khi có một đối tượng bên ngoài gọi đến. Mọi chuyện có vẻ ổn cho đến khi người phân tích yêu cầu muốn Computer bao gồm cả hard disk và chúng ta phải thay đổi lớp Computer cho phù hợp:

public class Computer {

public Computer() {

}

public String description() {

return “Computer include: monitor, hard disk”;

}

}

Và rồi còn thêm cả bạn phím nữa:

public class Computer {

public Computer() {

}

public String description() {

return “Computer include: monitor, hard disk, keyboard”;

}

}

Và bây giờ khi gọi description chúng ta sẽ nhận được:

Computer include: monitor, hard disk

Như thế bạn có thể thấy mỗi khi yêu cầu thay đổi, chúng ta sẽ phải thay đổi code của mình cho phù hợp.

Nhưng chúng ta vẫn còn một cách tiếp cận khác đó là sử dụng Decoration pattern bằng cách viết thêm code wrapper lớp Computer ban đầu để có thể thêm các thành phần vào lớp Computer mà không phải thay đổi nó.

Chúng ta có thể xem qua biểu đồ sau:

decoration pattern

Code thực thi của lớp CopmputerDecoration

 

public abstract class ComputerDecoration extends Computer

{

public abstract String description();

}

 

và các lớp con của nó:

public class HardDisk extends ComputerDecoration

{

Computer computer;

public Disk(Computer c)

{

computer = c;

}

public String description()

{

return computer.description() + “ and a disk”;

}

}

 

public class Keyboard extends ComputerDecoration

{

Computer computer;

public CD(Computer c)

{

computer = c;

}

public String description()

{

return computer.description() + “ and a keyboard”;

}

}

 

public class Monitor extends ComputerDecoration

{

Computer computer;

public Monitor(Computer c)

{

computer = c;

}

public String description()

{

return computer.description() + “ and a monitor”;

}

}

 

Bây giờ chúng ta viết một phương thức main để chạy thử ví dụ:

 

public class Test

{

public static void main(String args[])

{

Computer computer = new Computer();

computer = new Disk(computer);

computer = new Monitor(computer);

computer = new Keyboard(computer);

System.out.println(“You’re getting a “ + computer.description()

+ “.”);

}

}

 

Như các bạn thấy chúng ta có thể mở rộng thêm tính năng bằng cách thêm vào thành phần con mà chúng ta muốn.