Рубрики
Uncategorized

Подробное объяснение комбинированного режима шаблона проектирования PHP [игровой кейс StarCraft]

Автор оригинала: David Wong.

В этой статье описывается комбинированный шаблон шаблона проектирования PHP. Подробности заключаются в следующем:

В interstellar мы можем загружать карты, созданные другими пользователями, или создавать ваши собственные карты.

Когда мы выбираем, на какую карту играть, мы видим, что в игре указана карта или название пакета карт в текущем пакете карт.

Хотя карты и пакеты карт различаются по файлам и папкам, мы всегда надеемся использовать объекты для абстракции при их разработке.

Можем ли мы упростить разницу между картой и пакетом карт?

Проблемы, которые необходимо решить: Попробуйте вызвать эти два объекта с одним и тем же кодом, то есть во многих случаях нет необходимости различать, карта это или пакет карт.

Мышление: Давайте создадим абстрактный класс и позволим классу карты и классу пакета карты наследовать его. Многие методы этого класса имеют одинаковые имена.

Пример составного режима:

php
  //Abstract map class
  abstract class abstractMap
  {
    //The name of the map or map package
    public $name;

    //Construction method
    public function __construct($name)
    {
      $this->name = $name;
    }

    //The name of the map or map package,地图对象没有子对象,所以用空函数,直接继承
    public function getChildren(){}

    //Add sub object, map object has no sub object, so use empty function, inherit directly
    public function addChild(abstractMap $child){}

    //Displays the name of the map or map package
    public function showMapName()
    {
      echo $this->name."
"; } //Display sub object, map object has no sub object, so use empty function, inherit directly public function showChildren(){} } //Map class, inheriting Abstract map, in which we temporarily use the method of abstract map class Map extends abstractMap { } //Map package class inherits Abstract map, in which we need to overload the method of abstract map class MapBag extends abstractMap { //Collection of subobjects public $childern; //Add a sub object and force the use of an abstractmap object. Of course, maps and map packages are also abstractmap objects because they inherit the abstractmap public function addChild(abstractMap $child) { $this->childern[] = $child; } //Add sub object public function function showChildren() { if (count($this->childern)>0) { foreach ($this->childern as $child) { //The name of the calling map or package $child->showMapName(); } } } } //Create a new map package object. Suppose the folder name is allied. You can take a look at the interstellar map directory. It really exists $map1 = new MapBag('Allied'); //Create a new map object, assuming the file name is (2) fire Walker (also real) $map2 = new Map('(2)Fire Walker'); //Next, we can see the characteristics and uses of the combination pattern. //Suppose that the following code needs to operate on two objects, but we don't know who is the map and who is the map package //Add a sub object to $MAP1, which is a map, (4) the gardens $map1->addChild(new Map('(4)The Gardens')); //Show its sub objects $map1->showChildren(); //Add a child object to $MAP2, which is a map. (2) fire walker. No error will be reported here, because the map inherits an empty add method $map2->addChild(new Map('(2)Fire Walker')); //Show its sub objects,也不会出错,因为地图继承了一个空的展示方法 $map2->showChildren(); ?>

Краткое описание использования: Комбинированный режим может работать с контейнерами и объектами (пакет карт и карта здесь) единым способом. Когда другие коды имеют дело с этими объектами, им не нужно исследовать, кто является контейнерами, а кто объектами. Чтобы упростить объяснение, здесь нет углубленного обсуждения. На самом деле комбинированный режим часто используется для объединения с итеративным режимом. Например, мы можем использовать единый метод (например, метод show children здесь) для получения всех имен карт (включая подкаталоги) в пакете карт

Краткое описание реализации: Используйте базовый класс для реализации некоторых общих методов для контейнеров и объектов, таких как приведенная выше абстрактная карта, а затем позвольте классам контейнеров и объектов наследовать базовый класс. Из-за их различных характеристик перегружайте соответствующие методы в классах контейнеров и объектов, таких как метод addchild. Таким образом, два объекта могут управляться единым способом.

Подробнее о содержании, связанном с PHP, заинтересованные читатели могут ознакомиться со специальными разделами этого веб-сайта: “Вводный учебник по объектно-ориентированному программированию PHP”, “Энциклопедия навыков работы с массивами PHP”, “Вводный учебник по базовой грамматике PHP”, “Краткое описание операций PHP и использования операторов”, “Краткое описание использования строк PHP”, “Вводный учебник по работе с базой данных PHP + MySQL” и “Общая работа с базой данных PHP” Краткое описание навыков написания

Я надеюсь, что эта статья будет полезна для программирования на PHP.