zoukankan      html  css  js  c++  java
  • PHP的设计模式总结策略模式

    策略模式的简单解释就是一个主体为了解决某个问题列出几种策略,根据策略产生具体的行为方法。

    想实现这样一个功能:开展一个网站邀请活动,然后参与者将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,的邀请日志记录条数加1

    采用策略模式我们可以

    1:如果产品人员现在决定不要计数这个功能,那我们只需修改 策略模块。
    2:如果决定邀请到一个人数字加2 ,我们则只需修改相应的行为类。
    3:在如果这个产品人员实在变态,把邀请的整个逻辑都改了,那我们只需要 增加相应的策略类,然后增加行为(如果存在就不必增加)主体始终是不需要修改的。 

    /**
     * 活动主体类
    */
    class Activity  {
        private $strategy; //用于保存策略实例
        public  $strategyName = 'DEFAULTActivityStrategy';
        public function __construct($strategyName) {
            if(!empty($strategyName)){
                $this->strategyName = $strategyName;
            }
            $this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加载策略类
        }
        public function addLog() {
            $data = array('id'=>'uid','event'=>'eventName');  // 添加到数据库的数据
            $this->strategy->addLog($data);
        }
    }
    /**
     * 策略工厂策略类
     */
    abstract class AbstractActivityStrategy
    {
        abstract public function addLog($data);
        public static function getInstance($strategyName)
        {
            return new $strategyName;
        }
    }
    
    /**
     * 策略具体类
     */
    class DEFAULTActivityStrategy extends AbstractActivityStrategy {
        public function addLog($data) {
            $activityLog = new ActivityLog();
            $activityLog->save($data);
            $activityLogAmount = new ActivityLogAmount(); //计数类
            $activityLogAmount->countValue += 1;
            $activityLogAmount->save();
        }
    }
    /**
     * 活动日志具体类
     */
    class ActivityLog  {
    
        public function save($data)
        {
            echo "数据保存到数据库<br/>";
        }
    }
    /**
     * 活动计数具体类
     */
    class ActivityLogAmount {
        public $countValue; //邀请记录数
        public function __construct()
        {
            $this->countValue = 0;
        }
        public function save()
        {
            echo "推荐次数为".$this->countValue;
        }
    }
    
    
    $activity = new Activity(null);
    $activity->addLog();

    测试结果为

    数据保存到数据库
    推荐次数为1

  • 相关阅读:
    SpringDataRedis 常用命令
    Java 连接 Redis
    Java 循环标记
    初学Docker
    线程池,进程和线程的理解
    Linux-定时器任务
    Linux 命令2
    Linux命令
    Java基础整理
    微服务简介
  • 原文地址:https://www.cnblogs.com/phplover/p/2970169.html
Copyright © 2011-2022 走看看