設計模式基礎(一)

設計模式的宗旨就是:重用。

在面向對象中,類是用於生成對象的代碼模版,而設計模式是用於解決共性問題的代碼模版。

遵循這樣的模板,我們可以設快速地設計出優秀的代碼。

注意,設計模式只是模板,不是具體的代碼。

它是爲了代碼複用,增加可維護性

在學習設計模式的時候,有幾個概念讓我很難接受,這可能是從過程式編程轉到面向對象編程的禁錮。

假設有這樣一個對象:

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章