Decorator
Administrator 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
2
3
class BookingRoom implements Room {
public function price() {
return 50;
}
}
1
2
3
4
5
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
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
2
3
4
5
6
class ConditioningRoom extends RoomDecorator {
public function price()
{
return parent::price() + 5;
}
}
1
2
3
4
5
6
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
2
3
4
5
6
7