8000 Merge branch 'master' of https://github.com/flyingalex/design-pattern… · sockstack/design-patterns-by-php@3cfed41 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3cfed41

Browse files
committed
2 parents 87aad4b + b48840b commit 3cfed41

File tree

3 files changed

+284
-0
lines changed

3 files changed

+284
-0
lines changed

codes/ChainOfResponsibility.php

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
<?php
2+
3+
// abstract class Handler
4+
// {
5+
// protected $successor;
6+
7+
// public function setSuccessor(Handler $successor)
8+
// {
9+
// $this->successor = $successor;
10+
// }
11+
12+
// abstract function handleRequest(int $request);
13+
// }
14+
15+
// class ConcreteHandler1 extends Handler
16+
// {
17+
// public function handleRequest(int $request)
18+
// {
19+
// if ($request >=0 && $request < 10)
20+
// {
21+
// echo "ConcreteHandler1 handle it\n";
22+
// } else if ($this->successor != null) {
23+
// $this->successor->handleRequest($request);
24+
// }
25+
// }
26+
// }
27+
28+
// class ConcreteHandler2 extends Handler
29+
// {
30+
// public function handleRequest(int $request)
31+
// {
32+
// if ($request >=10 && $request < 20)
33+
// {
34+
// echo "ConcreteHandler2 handle it\n";
35+
// } else if ($this->successor != null) {
36+
// $this->successor->handleRequest($request);
37+
// }
38< 8000 span class="diff-text-marker">+
// }
39+
// }
40+
41+
// // client
42+
// $h1 = new ConcreteHandler1();
43+
// $h2 = new ConcreteHandler2();
44+
// $h1->setSuccessor($h2);
45+
// $requests = [1,5,7,16,25];
46+
// foreach ($requests as $value) {
47+
// $h1->handleRequest($value);
48+
// }
49+
50+
class Request
51+
{
52+
protected $requestType;
53+
public function setRequestType($requestType)
54+
{
55+
$this->requestType = $requestType;
56+
}
57+
public function getRequestType()
58+
{
59+
return $this->requestType;
60+
}
61+
62+
protected $requestContent;
63+
public function setRequestContent($requestContent)
64+
{
65+
$this->requestContent = $requestContent;
66+
}
67+
public function getRequestContent()
68+
{
69+
return $this->requestContent;
70+
}
71+
72+
protected $number;
73+
public function setNumber($number)
74+
{
75+
$this->number = $number;
76+
}
77+
public function getNumber()
78+
{
79+
return $this->number;
80+
}
81+
}
82+
83+
84+
85+
// salary raises
86+
abstract class Manager
87+
{
88+
protected $name;
89+
protected $superior;
90+
91+
function __construct($name)
92+
{
93+
$this->name = $name;
94+
}
95+
96+
public function setSuperior($superior)
97+
{
98+
$this->superior = $superior;
99+
}
100+
101+
//apply
102+
abstract public function requestApplications(Request $request);
103+
}
104+
105+
106+
class CommonManager extends Manager
107+
{
108+
public function requestApplications(Request $request)
109+
{
110+
if ($request->requestType === 'dayoff' && $request->number <=2)
111+
{
112+
echo $this->name.":".$request->getRequestContent()." times:".$request->getNumber()."\n";
113+
} else {
114+
if ($this->superior != null) {
115+
$superior->requestApplications($request);
116+
}
117+
}
118+
}
119+
}
120+
121+
class MajaorManager extends Manager
122+
{
123+
public function requestApplications(Request $request)
124+
{
125+
if ($request->requestType === 'dayoff' && $request->number <=5)
126+
{
127+
echo $this->name.":".$request->getRequestContent()." times:".$request->getNumber()."\n";
128+
} else {
129+
if ($this->superior != null) {
130+
$superior->requestApplications($request);
131+
}
132+
}
133+
}
134+
}
135+
136+
class GeneralManager extends Manager
137+
{
138+
public function requestApplications(Request $request)
139+
{
140+
if ($request->requestType === 'dayoff')
141+
{
142+
echo $this->name.":".$request->getRequestContent()." times:".$request->getNumber()."\n";
143+
} else if ($request->requestType === 'salary' && $request->number <= 500){
144+
echo $this->name.":".$request->getRequestContent()." money:".$request->getNumber()."\n";
145+
} else {
146+
echo "no way!\n";
147+
}
148+
}
149+
}

codes/Flyweight.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
abstract class Flyweight
4+
{
5+
abstract public function operation($extringsicState);
6+
}
7+
8+
class ConcreteFlyweight extends Flyweight
9+
{
10+
public function operation($extringsicState)
11+
{
12+
echo "ConcreteFlyweight:".$extringsicState."\n";
13+
}
14+
}
15+
16+
class UnsharedConcreteFlyweight extends Flyweight
17+
{
18+
public function operation($extringsicState)
19+
{
20+
echo "Unshared ConcreteFlyweight:".$extringsicState."\n";
21+
}
22+
}
23+
24+
class FlyweightFactory
25+
{
26+
private $flyweights = [];
27+
28+
function __construct()
29+
{
30+
$this->flyweights['x'] = new ConcreteFlyweight();
31+
$this->flyweights['y'] = new ConcreteFlyweight();
32+
$this->flyweights['z'] = new ConcreteFlyweight();
33+
}
34+
35+
public function getFlyweight($key)
36+
{
37+
return $this->flyweights[$key];
38+
}
39+
}
40+
41+
//client
42+
43+
$state = 22;
44+
$f = new FlyweightFactory();
45+
$fx = $f->getFlyweight('x');
46+
$fx->operation(--$state);
47+
48+
$fx = $f->getFlyweight('y');
49+
$fx->operation(--$state);
50+
51+
$fx = $f->getFlyweight('z');
52+
$fx->operation(--$state);
53+
54+
$uf = new UnsharedConcreteFlyweight();
55+
$uf->operation(--$state);

codes/Mediator.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
abstract class Mediator
4+
{
5+
abstract public send($message, Colleague $colleague);
6+
}
7+
8+
abstract class Colleague
9+
{
10+
protected $mediator;
11+
12+
function __construct(Mediator $mediator)
13+
{
14+
$this->mediator = $mediator;
15+
}
16+
}
17+
18+
class ConcreteMediator extends Mediator
19+
{
20+
private $colleague1;
21+
private $colleague2;
22+
23+
public function setColleague1(Colleague $colleague)
24+
{
25+
$this->colleague1 = $colleague1;
26+
}
27+
28+
public function setColleague2(Colleague $colleague)
29+
{
30+
$this->colleague2 = $colleague2;
31+
}
32+
33+
public function send($message, Colleague $colleague)
34+
{
35+
if($this->colleague1 == $colleague)
36+
{
37+
$this->colleague2->notify();
38+
} else {
39+
$this->colleague1->notify();
40+
}
41+
}
42+
}
43+
44+
class ConcreteColleague1 extends Colleague
45+
{
46+
public function send($message)
47+
{
48+
$this->mediator->send($message, this);
49+
}
50+
51+
public function notify($message)
52+
{
53+
echo "ConcreteColleague1\n";;
54+
}
55+
}
56+
57+
class ConcreteColleague2 extends Colleague
58+
{
59+
public function send($message)
60+
{
61+
$this->mediator->send($message, this);
62+
}
63+
64+
public function notify($message)
65+
{
66+
echo "ConcreteColleague2\n";;
67+
}
68+
}
69+
70+
//client
71+
72+
$mediator = new ConcreteMediator();
73+
$c1 = new ConcreteColleague1($mediator);
74+
$c2 = new ConcreteColleague2($mediator);
75+
76+
$mediator->setColleague1($c1);
77+
$mediator->setColleague2($c2);
78+
79+
$c1->send('do you eat?');
80+
$c2->send('no, do you want to invite me to dinner?');

0 commit comments

Comments
 (0)
0