Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Musterdesign-Adaptermuster

PHP-Musterdesign-Adaptermuster

WBOY
WBOYOriginal
2016-07-29 09:14:521351Durchsuche

Ich habe seit mehr als einem halben Monat keinen Aufsatz mehr geschrieben. Das liegt hauptsächlich daran, dass ich zu Beginn meines Abschlussjahrs viele unordentliche Dinge zu erledigen habe und meine Jobsuche blockiert ist. Vor allem wegen meiner eigenen mangelnden Kraft, vor allem aber wegen meiner fehlenden herausragenden Praxiserfahrung, war es schwierig, das Interesse der Personalabteilung zu wecken. Deshalb hier eine kleine Anzeige, in der Hoffnung, dass mir jemand einen Job geben kann. Es spielt keine Rolle, ob ich ein Praktikum mache. Im schlimmsten Fall ist es egal, ob ich nicht bezahlt werde (ich bin so schockiert, dass ich es getan habe). überhaupt kein Endergebnis). Der Ort ist beliebig, aber derzeit kann ich nur das verbleibende Jahr in Chengdu verbringen. Code schreiben kann ich jedenfalls überall.

Ich schäme mich, sagen zu müssen, dass ich immer das Gefühl habe, dass ich „viele große Wahrheiten kenne, aber ich kann dieses Leben einfach nicht gut leben.“ Unabhängig davon, ob jemand diese Blogs liest, sollten Sie immer über Ihren aktuellen Wissensstand schreiben und, was noch wichtiger ist, darauf hoffen, von älteren Menschen Rat zu erhalten.

Zurück zum Thema: Nachdem ich zuvor die drei grundlegenden Entwurfsmuster vorgestellt habe, werde ich heute einen weiteren Modus vorstellen, den wir unserer Meinung nach nicht oft verwenden, der aber bei Bedarf sehr praktisch ist – Adaptermodell.

In einer Zeit, in der Menschen mit oder ohne Objekte „Orientiert an Objekten“ rufen, wird uns die Beherrschung der Objektorientierung unerwartete Vorteile bringen . Freunde, die Programmieren lernen, können zunächst ein paar Zeilen Code schreiben, um einfache Funktionen zu implementieren, und dann lernen, einige wiederholte Vorgänge zu einer „Funktion“ zu kombinieren und später „Funktionen“ und Attribute zu einer „Klasse“ zu kombinieren. Schritt für Schritt überlegen wir, die Effizienz der Maschinen, die Code ausführen, zu verbessern und gleichzeitig die Arbeitsbelastung der Programmierer zu verringern. Was ist also die wichtigere Überlegung für das Adaptermodell, über das wir heute sprechen? Es ist die Arbeitsbelastung des Programmierers.

Wann wird das Adaptermuster verwendet?

Tatsächlich ist das einfachste Beispiel, wenn wir auf eine Bibliothek eines Drittanbieters verweisen. Wenn sich die Version dieser Klassenbibliothek ändert, ändert sich möglicherweise auch die von ihr bereitgestellte API. Wenn sich unglücklicherweise eine API, auf die in Ihrer Anwendung verwiesen wird, geändert hat, müssen Sie nicht nur stillschweigend „wocao“ in Ihrem Herzen verfluchen, sondern auch in den sauren Apfel beißen und eine Menge Code ändern.

Muss es wirklich so sein? Normalerweise würde ich mit „Nein“ antworten. Wir haben das Adaptermuster~~

Wenn sich die Schnittstelle ändert, ist das Adaptermuster praktisch.

Geben Sie mir ein Beispiel

Wenn Sie es anhand der einfachen Beschreibung oben verstehen können, kann ich Ihr überlegenes Verständnisvermögen nur bewundern. Die meisten Menschen müssen immer noch verwirrt sein. Zum besseren Verständnis zitiere ich ein Beispiel eines Bloggers. Ursprüngliche Adresse.

Harmonie am Anfang

Die Heizao Toy Company ist auf die Herstellung von Spielzeug spezialisiert, und die von ihr hergestellten Spielzeuge sind nicht darauf beschränkt Hunde, Katzen, Löwen, Fische und andere Tiere. Jedes Spielzeug kann die Operationen „Mund öffnen“ und „Mund schließen“ ausführen, und die Methoden openMouth und closeMouth werden jeweils aufgerufen.

Zu diesem Zeitpunkt können wir leicht denken, dass wir zunächst eine abstrakte Klasse Toy oder sogar eine Schnittstelle Toy definieren können. Dies ist kein großes Problem der Elternklasse. Es herrscht Harmonie und Vertrauen.

Zerstörung des Gleichgewichts

Um das Geschäft auszubauen, kooperiert die Black Date Toy Company nun mit der Red Date Remote Control Company, und Die Red Date Remote Control Company kann Fernbedienungsgeräte zur Kontrolle von Tieren verwenden. Führen Sie eine Mundkontrolle durch. Das Fernbedienungsgerät der Hongzao Remote Control Company ruft jedoch die Methoden doMouthOpen und doMouthClose von Tieren auf. Was die Programmierer der Heizao Toy Company jetzt tun müssen, ist, die Klassen der Toy-Serie zu aktualisieren, damit Toy die Methoden doMouthOpen und doMouthClose aufrufen kann.

Als wir über die Implementierungsmethode nachgedacht haben, dachten wir direkt, dass ich diese beiden Methoden bei Bedarf einfach zu meiner übergeordneten Klasse und Unterklasse für Sie hinzufügen werde. Wenn Sie diese beiden Methoden immer wieder zur übergeordneten Klasse und Unterklasse hinzufügen, werden Sie immer über solche sich wiederholenden Arbeiten nachdenken. Kann das nicht gelöst werden? Programmierer werden verrückt, wenn es Hunderte von Unterklassen gibt. Programmierer konkurrieren oft darum, wer „fauler“ ist, wenn dies keinen Einfluss auf die Effizienz hat. Programmierer werden sich dumm fühlen, wenn sie so weitermachen. (Eigentlich benehme ich mich oft wie dieser Idiot)

<span>abstract</span><span>class</span><span> Toy
{
    </span><span>public</span><span>abstract</span><span>function</span><span> openMouth();

    </span><span>public</span><span>abstract</span><span>function</span><span> closeMouth();

    </span><span>//</span><span>为红枣遥控公司控制接口增加doMouthOpen方法</span><span>public</span><span>abstract</span><span>function</span><span> doMouthOpen();

    </span><span>//</span><span>为红枣遥控公司控制接口增加doMouthClose方法</span><span>public</span><span>abstract</span><span>function</span><span> doMouthClose();
}

</span><span>class</span> Dog <span>extends</span><span> Toy
{
    </span><span>public</span><span>function</span><span> openMouth()
    {
        </span><span>echo</span> "Dog open Mouth\n"<span>;
    }

    </span><span>public</span><span>function</span><span> closeMouth()
    {
        </span><span>echo</span> "Dog open Mouth\n"<span>;
    }

    </span><span>//</span><span>增加的方法</span><span>public</span><span>function</span><span> doMouthOpen()
    {
        </span><span>$this</span>-><span>doMouthOpen();
    }

    </span><span>//</span><span>增加的方法</span><span>public</span><span>function</span><span> doMouthClose()
    {
        </span><span>$this</span>-><span>closeMouth();
    }
}

</span><span>class</span> Cat <span>extends</span><span> Toy
{
    </span><span>public</span><span>function</span><span> openMouth()
    {
        </span><span>echo</span> "Cat open Mouth\n"<span>;
    }

    </span><span>public</span><span>function</span><span> closeMouth()
    {
        </span><span>echo</span> "Cat open Mouth\n"<span>;
    }

    </span><span>//</span><span>增加的方法</span><span>public</span><span>function</span><span> doMouthOpen()
    {
        </span><span>$this</span>-><span>doMouthOpen();
    }

    </span><span>//</span><span>增加的方法</span><span>public</span><span>function</span><span> doMouthClose()
    {
        </span><span>$this</span>-><span>closeMouth();
    }
}</span>

Genervter

Der Programmierer ist gerade mit dem Codieren fertig , trank einen Schluck Wasser und plötzlich kam eine weitere Nachricht.

Black Zao Toy Company möchte auch mit Lu Zao Remote Control Company zusammenarbeiten, da die Fernbedienungsausrüstung der Lu Zao Remote Control Company billiger und stabiler ist. Das Fernbedienungsgerät der Green Date Remote Control Company ruft jedoch die operMouth($type)-Methode des Tieres auf, um eine Mundkontrolle zu erreichen. Wenn $type 0 ist, „Halt die Klappe“, sonst mach den Mund auf.

Das ist gut so, Programmierer müssen Toy und seine Unterklassen aktualisieren, damit Toy die operMouth()-Methode aufrufen kann. Niemand ist mehr ruhig.

<span>abstract</span><span>class</span><span> Toy  
{  
    </span><span>public</span><span>abstract</span><span>function</span><span> openMouth();  
  
    </span><span>public</span><span>abstract</span><span>function</span><span> closeMouth();  
  
    </span><span>public</span><span>abstract</span><span>function</span><span> doMouthOpen();  
  
    </span><span>public</span><span>abstract</span><span>function</span><span> doMouthClose();  
  
    </span><span>//</span><span>为绿枣遥控公司控制接口增加doMouthClose方法  </span><span>public</span><span>abstract</span><span>function</span> operateMouth(<span>$type</span> = 0<span>);  
}  
  
</span><span>class</span> Dog <span>extends</span><span> Toy  
{  
    </span><span>public</span><span>function</span><span> openMouth()  
    {  
        </span><span>echo</span> "Dog open Mouth\n"<span>;  
    }  
  
    </span><span>public</span><span>function</span><span> closeMouth()  
    {  
        </span><span>echo</span> "Dog open Mouth\n"<span>;  
    }  
  
    </span><span>public</span><span>function</span><span> doMouthOpen()  
    {  
        </span><span>$this</span>-><span>doMouthOpen();  
    }  
  
    </span><span>public</span><span>function</span><span> doMouthClose()  
    {  
        </span><span>$this</span>-><span>closeMouth();  
    }  
  
    </span><span>public</span><span>function</span> operateMouth(<span>$type</span> = 0<span>)  
    {  
        </span><span>if</span> (<span>$type</span> == 0<span>) {  
            </span><span>$this</span>-><span>closeMouth();  
        } </span><span>else</span><span> {  
            </span><span>$this</span>-><span>operateMouth();  
        }  
    }  
}  
  
</span><span>class</span> Cat <span>extends</span><span> Toy  
{  
    </span><span>public</span><span>function</span><span> openMouth()  
    {  
        </span><span>echo</span> "Cat open Mouth\n"<span>;  
    }  
  
    </span><span>public</span><span>function</span><span> closeMouth()  
    {  
        </span><span>echo</span> "Cat open Mouth\n"<span>;  
    }  
  
    </span><span>public</span><span>function</span><span> doMouthOpen()  
    {  
        </span><span>$this</span>-><span>doMouthOpen();  
    }  
  
    </span><span>public</span><span>function</span><span> doMouthClose()  
    {  
        </span><span>$this</span>-><span>closeMouth();  
    }  
  
    </span><span>public</span><span>function</span> operateMouth(<span>$type</span> = 0<span>)  
    {  
        </span><span>if</span> (<span>$type</span> == 0<span>) {  
            </span><span>$this</span>-><span>closeMouth();  
        } </span><span>else</span><span> {  
            </span><span>$this</span>-><span>operateMouth();  
        }  
    }  
}</span>

Zu diesem Zeitpunkt müssen Programmierer ihren Verstand einsetzen, um einen Weg zu finden. Selbst wenn sie fleißig sind, was ist, wenn eines Tages all diese Fernbedienungsunternehmen nach China kommen? Mit der Zeit wird diese Spielzeugklasse unabhängig von meiner zunehmenden Arbeitsbelastung immer größer. Wenn der Programmierer nicht abstürzt, wird auch das System abstürzen.

Wo liegt das Problem?

  像上面那样编写代码,代码实现违反了“开-闭”原则,一个软件实体应当对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。也就是说每个尸体都是一个小王国,你让我参与你的事情这个可以,但你不能修改我的内部,除非我的内部代码确实可以优化。

  在这种想法下,我们懂得了如何去用继承,如何利用多态,甚至如何实现“高内聚,低耦合”。

  回到这个问题,我们现在面临这么一个问题,新的接口方法我要实现,旧的接口(Toy抽象类)也不能动,那么总得有个解决方法吧。那就是引入一个新的类--我们本文的主角--适配器。  适配器要完成的功能很明确,引用现有接口的方法实现新的接口的方法。更像它名字描述的那样,你的接口不改的话,我就利用现有接口和你对接一下吧。 

  到此,解决方法已经呼之欲出了,下面贴上代码。

   

<?<span>php
</span><span>abstract</span><span>class</span><span> Toy  
{  
    </span><span>public</span><span>abstract</span><span>function</span><span> openMouth();  
  
    </span><span>public</span><span>abstract</span><span>function</span><span> closeMouth();  
}  
  
</span><span>class</span> Dog <span>extends</span><span> Toy  
{  
    </span><span>public</span><span>function</span><span> openMouth()  
    {  
        </span><span>echo</span> "Dog open Mouth\n"<span>;  
    }  
  
    </span><span>public</span><span>function</span><span> closeMouth()  
    {  
        </span><span>echo</span> "Dog close Mouth\n"<span>;  
    }  
}  
  
</span><span>class</span> Cat <span>extends</span><span> Toy  
{  
    </span><span>public</span><span>function</span><span> openMouth()  
    {  
        </span><span>echo</span> "Cat open Mouth\n"<span>;  
    }  
  
    </span><span>public</span><span>function</span><span> closeMouth()  
    {  
        </span><span>echo</span> "Cat close Mouth\n"<span>;  
    }  
}


</span><span>//</span><span>目标角色:红枣遥控公司  </span><span>interface</span><span> RedTarget  
{  
    </span><span>public</span><span>function</span><span> doMouthOpen();  
  
    </span><span>public</span><span>function</span><span> doMouthClose();  
}  
  
</span><span>//</span><span>目标角色:绿枣遥控公司及  </span><span>interface</span><span> GreenTarget  
{  
    </span><span>public</span><span>function</span> operateMouth(<span>$type</span> = 0<span>);  
}


</span><span>//</span><span>类适配器角色:红枣遥控公司  </span><span>class</span> RedAdapter <span>implements</span><span> RedTarget  
{  
    </span><span>private</span><span>$adaptee</span><span>;  
  
    </span><span>function</span> __construct(Toy <span>$adaptee</span><span>)  
    {  
        </span><span>$this</span>->adaptee = <span>$adaptee</span><span>;  
    }  
  
    </span><span>//</span><span>委派调用Adaptee的sampleMethod1方法  </span><span>public</span><span>function</span><span> doMouthOpen()  
    {  
        </span><span>$this</span>->adaptee-><span>openMouth();  
    }  
  
    </span><span>public</span><span>function</span><span> doMouthClose()  
    {  
        </span><span>$this</span>->adaptee-><span>closeMouth();  
    }  
}  
  
</span><span>//</span><span>类适配器角色:绿枣遥控公司  </span><span>class</span> GreenAdapter <span>implements</span><span> GreenTarget  
{  
    </span><span>private</span><span>$adaptee</span><span>;  
  
    </span><span>function</span> __construct(Toy <span>$adaptee</span><span>)  
    {  
        </span><span>$this</span>->adaptee = <span>$adaptee</span><span>;  
    }  
  
    </span><span>//</span><span>委派调用Adaptee:GreenTarget的operateMouth方法  </span><span>public</span><span>function</span> operateMouth(<span>$type</span> = 0<span>)  
    {  
        </span><span>if</span> (<span>$type</span><span>) {  
            </span><span>$this</span>->adaptee-><span>openMouth();  
        } </span><span>else</span><span> {  
            </span><span>$this</span>->adaptee-><span>closeMouth();  
        }  
    }  
}



</span><span>class</span><span> testDriver  
{  
    </span><span>public</span><span>function</span><span> run()  
    {  
         </span><span>//</span><span>实例化一只狗玩具  </span><span>$adaptee_dog</span> = <span>new</span><span> Dog();  
        </span><span>echo</span> "给狗套上红枣适配器\n"<span>;  
        </span><span>$adapter_red</span> = <span>new</span> RedAdapter(<span>$adaptee_dog</span><span>);  
        </span><span>//</span><span>张嘴  </span><span>$adapter_red</span>-><span>doMouthOpen();  
        </span><span>//</span><span>闭嘴  </span><span>$adapter_red</span>-><span>doMouthClose();  
        </span><span>echo</span> "给狗套上绿枣适配器\n"<span>;  
        </span><span>$adapter_green</span> = <span>new</span> GreenAdapter(<span>$adaptee_dog</span><span>);  
        </span><span>//</span><span>张嘴  </span><span>$adapter_green</span>->operateMouth(1<span>);  
        </span><span>//</span><span>闭嘴  </span><span>$adapter_green</span>->operateMouth(0<span>);  
    }  
}  
  
</span><span>$test</span> = <span>new</span><span> testDriver();  
</span><span>$test</span>->run();

   最后的结果就是,Toy类及其子类在不改变自身的情况下,通过适配器实现了不同的接口。

最后总结

  将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作.

 适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

      以上

系列文章:

      php模式设计之 单例模式

    php模式设计之 工厂模式

    php模式设计之 注册树模式

    php模式设计之 适配器模式

以上就介绍了php模式设计之 适配器模式,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn