-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathbehavioral-observer.php
123 lines (107 loc) · 3.06 KB
/
behavioral-observer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
/**
* This example just to simulate how Observer can be work
* 2nees.com
*/
/**
* Class Restaurant - Publisher (Subject) - subscription infrastructure that lets new subscribers join/left
*/
class Restaurant implements SplSubject {
private SplObjectStorage $observers;
private int $tableNumber = 0;
private int $numberOfCustomer = 0;
/**
* Restaurant constructor.
*/
public function __construct()
{
$this->observers = new SplObjectStorage();
}
public function attach(SplObserver $observer)
{
$this->observers->attach($observer);
}
public function detach(SplObserver $observer)
{
$this->observers->detach($observer);
}
public function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
/**
* Logic set here, we add notify if customer set down on table
*/
public function customerSetOnTable(){
$this->numberOfCustomer = rand(1, 5);
$this->tableNumber += 1;
$this->notify();
}
public function getTableNumber(): int
{
return $this->tableNumber;
}
public function getNumberOfCustomer(): int
{
return $this->numberOfCustomer;
}
}
/**
* Class Waiter - Concrete Subscribers - implement some action when notify received...
*/
class Waiter implements SplObserver {
public function update(SplSubject $subject)
{
/**
* @var Restaurant $subject
*/
echo "Hay!, We have a new customer here, check Table Number #{$subject->getTableNumber()}" . PHP_EOL;
}
}
/**
* Class Kitchen - Concrete Subscribers - implement some action when notify received...
*/
class Kitchen implements SplObserver {
public function update(SplSubject $subject)
{
/**
* @var Restaurant $subject
*/
echo "Hay!, We have an order for
Table Number #{$subject->getTableNumber()}
And We have {$subject->getNumberOfCustomer()} Customer" . PHP_EOL;
}
}
/**
* Class Accountant - Concrete Subscribers - implement some action when notify received...
*/
class Accountant implements SplObserver {
public function update(SplSubject $subject)
{
/**
* @var Restaurant $subject
*/
$numberOfCustomer = $subject->getNumberOfCustomer();
$initPrice = $numberOfCustomer * 0.5;// Number of user * half JOD
echo "Hay!, Invoice Start for
Table Number #{$subject->getTableNumber()}
And We have {$numberOfCustomer} Customer
And total init price is {$initPrice} JOD
" . PHP_EOL;
}
}
// Client
$restaurant = new Restaurant();
$kitchen = new Kitchen();
$waiter= new Waiter();
$accountant = new Accountant();
$restaurant->attach($waiter);
$restaurant->attach($kitchen);
$restaurant->attach($accountant);
$restaurant->customerSetOnTable();
echo "=======================================" . PHP_EOL;
$restaurant->customerSetOnTable();
echo "=======================================" . PHP_EOL;
$restaurant->customerSetOnTable();