Decorator Pattern

Decorator Pattern



Decorator Pattern được sử dụng để chỉnh sửa chức năng của một đối tượng trong thời gian chạy (runtime). Ở cùng thời điểm, những instance khác của cùng lớp sẽ không bị ảnh hưởng bởi hành động này. Chỉ có đối tượng riêng biệt nhận chỉnh sửa này mới bị tác động mà thôi.

Giả sử chúng ta muốn implement nhiều loại xe hơi khác nhau - chúng ta có thể tạo ra một interface Car để định nghĩa các phương thức chung và chúng ta có một kiểu xe cơ bản. Tiếp theo chúng ta có thể mở rộng thành các loại xe thể thao, cao cấp. Cấu trúc như sau:
decorator pattern, decorator design pattern, decorator pattern java
Nhưng nếu chúng ta muốn có một chiếc xe vào thời gian chạy chương trình mà chiếc xe này có tất cả các đặc điểm của cả xe thể thao lẫn xe cao cấp thì phần implementation sẽ trở nên phức tạp. Mở rộng hơn nữa, giả sử chúng ta có tới 10 loại xe khác nhau thì việc thỏa mãn yêu cầu tương tự như trên sẽ trở nên bất khả thi dù cho chúng ta có sử dụng biện pháp thừa kế hay composition (kết hợp). Để giải quyết bài toán dạng này, chúng ta sử dụng Decorator Pattern.

1. Component interface
package com.journaldev.design.decorator;

public interface Car {

 public void assemble();
}

2. Component implementation
package com.journaldev.design.decorator;

public class BasicCar implements Car {

 @Override
 public void assemble() {
  System.out.print("Basic Car.");
 }

}

3. Decorator
package com.journaldev.design.decorator;

public class CarDecorator implements Car {

 protected Car car;
 
 public CarDecorator(Car c){
  this.car=c;
 }
 
 @Override
 public void assemble() {
  this.car.assemble();
 }

}

4. Concrete Decorator

package com.journaldev.design.decorator;

public class SportsCar extends CarDecorator {

 public SportsCar(Car c) {
  super(c);
 }

 @Override
 public void assemble(){
  super.assemble();
  System.out.print(" Adding features of Sports Car.");
 }
}

package com.journaldev.design.decorator;

public class LuxuryCar extends CarDecorator {

 public LuxuryCar(Car c) {
  super(c);
 }
 
 @Override
 public void assemble(){
  super.assemble();
  System.out.print(" Adding features of Luxury Car.");
 }
}

decorator design pattern, decorator design pattern in java


5. Chương trình sử dụng
package com.journaldev.design.test;

import com.journaldev.design.decorator.BasicCar;
import com.journaldev.design.decorator.Car;
import com.journaldev.design.decorator.LuxuryCar;
import com.journaldev.design.decorator.SportsCar;

public class DecoratorPatternTest {

 public static void main(String[] args) {
  Car sportsCar = new SportsCar(new BasicCar());
  sportsCar.assemble();
  System.out.println("\n*****");
  
  Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
  sportsLuxuryCar.assemble();
 }

}
Kết quả hiển thị

Basic Car. Adding features of Sports Car.
*****
Basic Car. Adding features of Luxury Car. Adding features of Sports Car.







No comments :

Post a Comment