Maison développement back-end tutoriel php PHP草根论之设计模式-策略模式

PHP草根论之设计模式-策略模式

Jun 23, 2016 pm 01:47 PM

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

 

意图

 

策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

适用性

  • 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
  • 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句
  •  

     

     

    关于模式本身的概念,请参考网上其它文章

    此处只讨论在PHP实际开发过程中的应用

     

     

    此模式将算法与数据进行分离.

    算法:狭义算法,对固定结构的输入数据产生一个固定结构的输出.  不同的算法,输入是相同的,输出是不同但类似的,或输出相同但实现过程不同.

    数据:一个持有数据的对象/类定义.

     

    应用此模式的场景:

        1.多种不同类的数据对象, 持有相同结构的数据.

        2.多种算法对象,同一类或实现了同一接口

        3.调用者先告诉数据对象将使用哪一个算法 对象.  然后数据对象在业务逻辑中将使用指定的算法 对象来对数据进行处理.

     

    使用局限:

        1.通常PHP不用于进行数学计算类的任务,这种任务通常由C/C++/Java来进行.

        2.多种数据对象,多种算法对象, 一般的PHP业务逻辑不会复杂到这种程度.

      

    设想一个实例: 程序中有多个业务处理类, 我们要对业务处理过程记录日志,  现在有多种日志方式可供选择:文本/数据库/网络应用.调用者可以自行选择使用哪种日志方式.

     

    实现过程:

        1.先定义一个日志的父类/接口,然后创建三种具体的日志实现类

            interface LogInterface {

               public function log($data);

            }

     

       class LogFile implements LogInterface{

          public function log($data){

    //将数据写入文本文件

    }

       }

     

       class LogDB implements LogInterface{

            public function log($data){

                   //将数据写入数据库

            }

        }

        class LogNet implements LogInterface{

                public function log($data){

                    //通过网络对数据进行日志记录

               }

        }

    2.定义一个Trait (为所有业务类增加一些功能)

    trait LogTrait{

        //记录具体的日志对象

        private $_log;

     

        //调用者用来设置具体的日志对象

        public function setLog(LogInterface $log){

           $this->_log=$log;

        }

     

    //业务类中使用的功能

    //此方法可以定义为私有,如果没有外部访问的话

    //此方法的实现也可变更,数据可以使用参数方式传递

    public function log(){

      $this->_log->log($this->data);

    }

    }

     

    3.所有的业务类(需要日志功能的)

     

    //此类可能已经继承了父类

    class ModelA {

    use LogTrait;

     

    //业务类中的某一段需要使用日志的代码段

    public function process(){

    //为日志准备数据

    $this->data=$data;

     

    //记录日志,此代码可在本类中多次出现,或被外部调用

    $this->log();

    }

    }

     

     

     

    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

    Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

    Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

    L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

    Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

    Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

    12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

    Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

    Expliquez le concept de liaison statique tardive en PHP. Expliquez le concept de liaison statique tardive en PHP. Mar 21, 2025 pm 01:33 PM

    L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

    PHP Logging: meilleures pratiques pour l'analyse du journal PHP PHP Logging: meilleures pratiques pour l'analyse du journal PHP Mar 10, 2025 pm 02:32 PM

    La journalisation PHP est essentielle pour surveiller et déboguer les applications Web, ainsi que pour capturer des événements critiques, des erreurs et un comportement d'exécution. Il fournit des informations précieuses sur les performances du système, aide à identifier les problèmes et prend en charge le dépannage plus rapide

    Comment s'inscrire et utiliser les fournisseurs de services Laravel Comment s'inscrire et utiliser les fournisseurs de services Laravel Mar 07, 2025 am 01:18 AM

    Les fournisseurs de services et les fournisseurs de services de Laravel sont fondamentaux pour son architecture. Cet article explore les conteneurs de services, détaille la création du fournisseur de services, l'enregistrement et démontre l'utilisation pratique avec des exemples. Nous commencerons par un ove

    Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Mar 28, 2025 pm 05:12 PM

    L'article examine l'ajout de fonctionnalités personnalisées aux cadres, en se concentrant sur la compréhension de l'architecture, l'identification des points d'extension et les meilleures pratiques pour l'intégration et le débogage.

    See all articles