Decorator

7/10/2021 OOPPattern

# Description

To dynamically add new functionality to class instances.

  • Thêm chức năng mới mà không làm ảnh hưởng đến class.
  • Tham chiếu đến property, method đã được implement/

# Example

Add function for the booking room.

interface Room {
    public function price();
}
1
2
3
class BookingRoom implements Room {
    public function price() {
        return 50;
    }
}
1
2
3
4
5
  • Cần thêm các tiện ích vào BookingRoom.
  • Sẽ tính toán lại price theo tiện ích.
  • Nhưng không edit lại code của BookingRoom.
# Wifi

Tạo 1 decorator để add new funciton

class RoomDecorator implements Room {
    protected $room;
    
    public function __construct(Room $room) {
        $this->room = $room;
    }
    
    public function price()
    {
        return $this->room->price();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

Thêm tiện ích wifi

class WifiRoom extends RoomDecorator {
    public function price()
    {
        return parent::price() + 10;
    }
}
1
2
3
4
5
6
class ConditioningRoom extends RoomDecorator {
    public function price()
    {
        return parent::price() + 5;
    }
}
1
2
3
4
5
6

Usage

// Room normal
$room = new BookingRoom();
// $room->price() --- 50
$room = new WifiRoom($room);
// $room->price() --- 60
$room = new ConditioningRoom($room);
// $room->price() --- 65
1
2
3
4
5
6
7