設計模式的宗旨就是:重用。
在面向對象中,類是用於生成對象的代碼模版,而設計模式是用於解決共性問題的代碼模版。
遵循這樣的模板,我們可以設快速地設計出優秀的代碼。
注意,設計模式只是模板,不是具體的代碼。
它是爲了代碼複用,增加可維護性。
在學習設計模式的時候,有幾個概念讓我很難接受,這可能是從過程式編程轉到面向對象編程的禁錮。
假設有這樣一個對象:
class Person
{
private $name = 'Human';
public function getName()
{
return $this->name;
}
}
1 變量保存對象
不要覺得變量只能保存整形數字,數組和字符串,變量還可以保存對象的:
$man = new Person;
echo $man->getName();
2 傳遞對象參數
如果另一個類用到了Person類的屬性或方法,那直接穿進去就可以了:
class Student
{
public function __construct($person)
{
echo $person->getName();
}
}
// 傳遞對象,最後輸出字符串“Human”
$jack = new Student(new Person);
但是這樣有一個小問題,當傳遞給new
Student()
不是一個Person
對象時,如下,
$jack = new Student('abc');
程序就會報錯。於是有了第三種做法,限定參數的類型。
3 限定傳遞參數的類型
在傳遞參數的時候,就限定參數的類型,這樣寫:
class Student
{
public function __construct(Person $person)
{
echo $person->getName();
}
}
// 傳遞對象,
$jack = new Student(new Person);
這樣,傳給new
Student()
的參數必須是Person
的實例。
4 用類屬性保存對象
還有一種經常用到的做法,就是用一個類的屬性保存對象或對象集合。如下:
class Life
{
public $persons = [];
public function addPerson(Person $person)
{
$this->persons[] = $person;
}
}
$class = new Life();
$class->addPerson(new Person);
$class->addPerson(new Person);
var_dump($class->persons);
輸出值:
array(2) {
[0]=>
object(Person)#2 (1) {
["name":"Person":private]=>
string(5) "Human"
}
[1]=>
object(Person)#3 (1) {
["name":"Person":private]=>
string(5) "Human"
}
}
5 小結
面向對象的設計模式都是圍繞上面的情形,做一些組合之後形成的。
所以,理解類之間關係纔是重點。
互聯網+時代,時刻要保持學習,攜手千鋒PHP,Dream It Possible。