• php的设计模式


    简单工厂

     1 <?php
     2 interface db{
     3     function conn();
     4 }
     5 class dbMysql implements db{
     6     public function conn(){
     7         echo '连接上mysql';
     8     }
     9 }
    10 
    11 class dbSqlite implements db{
    12     public function conn(){
    13         echo '连接上sqlite';
    14     }
    15 }
    16 
    17 // 简单工厂
    18 class Factory {
    19     public static function createDb($type = ''){
    20         if($type == 'mysql'){
    21             return new dbMysql();
    22         }else if($type == 'sqlite'){
    23             return new dbSqlite();
    24         }else{
    25             throw new Exception("Error db type", 1);
    26         }
    27     }
    28 }
    29 
    30 // 只对外开放一个Factory::createDb()方法
    31 $mysql =  Factory::createDb('mysql');
    32 $mysql->conn();
    33 // 如果要新增数据库类型?还要去改代码,如果是java语言改完还要编译,这有多么麻烦
    34 // 在面向对象设计法则中,有一个开闭原则,对于修改是封闭,对于扩展是开放的。

    工厂模式

    <?php
    interface db{
        function conn();
    }
    interface factory{
        function createDb();
    }
    class dbMysql implements db{
        public function conn(){
            echo '连接上mysql';
        }
    }
    
    class dbSqlite implements db{
        public function conn(){
            echo '连接上sqlite';
        }
    }
    
    class mysqlFactory implements factory{
        public function createDb(){
            return new dbMysql();
        }
    }
    
    class sqliteFactory implements factory{
        public function createDb(){
            return new dbSqlite();
        }
    }
    
    $fact = new mysqlFactory();
    $db = $fact->createDb();
    $db->conn();

    单例模式

    <?php
    class Single{
        protected static $ins = null;
        public static function getIns() {
            if(self::$ins === null) {
                self::$ins = new self();
            }
            return self::$ins;
        }
        // 方法 + final 不能被覆盖  class + final 不能被继承
        final protected function __construct() {}
        final protected function __clone() {}
    }
    
    $s1 = Single::getIns();
    $s2 = clone $s1;
    if($s1 === $s2){
        echo '是同一个对象';
    }else{
        echo '不是同一个对象';
    }

     观察者模式

    <?php
    // php5中提供观察者模式observer与被观察者subject的接口
    
    
    class User implements SplSubject{
        public $login_num;
        public $observers = null;
        public $hobby;
        public function __construct(){
            $this->login_num = rand(1, 10);
            $hobbys = ['running', 'shopping', 'supprot', 'study'];
            shuffle($hobbys);
            $this->hobby = $hobbys[0];
            $this->observers =  new SplObjectStorage();
        }
    
        public function login(){
            echo 'login success';
            echo '<br>';
            $this->notify();
        }
    
        public function attach(SPLObserver $observer){
            $this->observers->attach($observer);
        }
    
        public function detach(SPLObserver $observer){
            $this->observers->detach($observer);
        }
    
        public function notify(){
            $this->observers->rewind();
            while ($this->observers->valid()) {
                $observer = $this->observers->current();
                $observer->update($this);
                $this->observers->next();
            }
        }
    }
    
    class safety implements SPLObserver{
        public function update(SplSubject $subject){
            if($subject->login_num > 3){
                echo '您频繁登陆,是否有难言之隐?'.'<br>';
            }
        }
    }
    
    
    class ad implements SPLObserver{
        public function update(SplSubject $subject){
            switch ($subject->hobby) {
                case 'running':
                    echo 'addidas运动裤大折扣';
                    break;
                case 'shopping':
                    echo '沃尔玛今日促销';
                    break;
                case 'supprot':
                    echo 'NBA总决赛明天开始';
                    break;
                case 'study':
                    echo '学习文具优惠';
                    break;
                default:
                    # code...
                    break;
            }
        }
    }
    
    $user = new User();
    $user->attach(new safety());
    $user->attach(new ad());
    $user->login();

    责任链模式

    <?php
    // 责任链模式
    
    
    class Brand{
        private $power = 1;
        private $higher = 'Admin';
    
        public function process($lev){
            if($lev <= $this->power){
                echo '版主删帖';
            }else{
                $higer = new $this->higher;
                $higer->process($lev);
            }
        }
    }
    
    
    class Admin{
        private $power = 2;
        private $higher = 'Proclie';
        public function process($lev){
            if($lev >= $this->power){
                echo '封号处理';
            }else{
                $higer = new $this->higher;
                $higer->process($lev);
            }
        }
    }
    
    
    class Proclie{
        public function process(){
            echo '请你喝茶';
        }
    }
    
    
    $dange_lever = 2;
    $judege = new Brand();
    $judege->process($dange_lever);

    策略模式

    <?php
    
    interface math{
        function calc($first, $last);
    }
    
    class Add implements math{
        public function calc($first, $last){
            return $first + $last;
        }
    }
    
    
    class Sub implements math{
        public function calc($first, $last){
            return $first - $last;
        }
    }
    
    
    class Mul implements math{
        public function calc($first, $last){
            return $first * $last;
        }
    }
    
    class Div implements math{
        public function calc($first, $last){
            return $first / $last;
        }
    }
    
    
    // 虚拟计算器
    class CMath{
        protected $calc = null;
        function __construct($calc){
            $this->calc = new $calc;
        }
        public function calc($first, $last){
            return $this->calc->calc($first, $last);
        }
    }
    
    $cmath = new CMath('Sub');
    echo $cmath->calc(3, 2);

     适配器模式

    <?php
    // 服务端
    class Weather{
        public static function show(){
            $today = ['tep' => 28, 'wind' => 7, 'sun' => 'sunny'];
            return serialize($today);
        }
    }
    
    // 增加一个适配器
    class AdapterWeather extends Weather{
        public static function show(){
            $today = parent::show();
            $today = json_encode(unserialize($today));
            return $today;
        }
    }
    
    // 客户端
    $data = unserialize(Weather::show());
    echo '今天温度'.$data['tep'].'度'.',天气:'.$data['sun'].'<br>';
    
    // 如果一个android端,访问这个接口,但是不认识php串行字符串,还要去改服务端改为返回json格式,而且还要顺便客户端也要顺便改,这样子很麻烦,我们可以使用适配器模式
    
    
    // 假设 java客户端
    $data = json_decode(AdapterWeather::show(),true);
    echo '今天温度'.$data['tep'].'度'.',天气:'.$data['sun'].'<br>';

     桥接模式

    <?php
    abstract class Info{
        // 发射器
        protected $send = null;
    
        public function __construct($send){
            $this->send = $send;
        }
    
        abstract public function msg($content);
    
        public function send($to, $content){
            $content = $this->msg($content);
            $this->send->send($to, $content);
        }
    }
    
    class zn{
        public function send($to, $content){
            echo 'zn站内给'.$to.'内容是'.$content;
        }
    }
    
    
    class sms{
        public function send($to, $content){
            echo 'sms站内给'.$to.'内容是'.$content;
        }
    }
    
    
    
    class email{
        public function send($to, $content){
            echo 'email站内给'.$to.'内容是'.$content;
        }
    }
    
    class commoninfo extends Info{
        public function msg($content){
            return '普通信息:'.$content;
        }
    }
    
    class warninfo extends Info{
        public function msg($content){
            return '紧急信息:'.$content;
        }
    }
    
    class dangeinfo extends Info{
        public function msg($content){
            return '特急信息:'.$content;
        }
    }
    
    $commoninfo = new commoninfo(new zn());
    $commoninfo->send('小明','吃鸡了');

     装饰模式

    <?php
    // 装饰器模式做文章修饰功能
    class BaseArt {
        protected $content;
        protected $art;
    
        public function __construct($content) {
            $this->content = $content;
        }
    
        public function decorator(){
            return $this->content;
        }
    }
    
    class BianArt extends BaseArt{
    
        public function __construct($art) {
            $this->art = $art;
            $this->decorator();
        }
    
        public function decorator() {
            return $this->content = $this->art->decorator(). '小编摘要';
        }
    }
    
    class SeonArt extends BaseArt{
    
        public function __construct($art) {
            $this->art = $art;
            $this->decorator();
        }
        public function decorator() {
            return $this->content = $this->art->decorator(). '加上seo关键词';
        }
    }
    
    
    $ba = new SeonArt(new BianArt(new BaseArt('天天向上')));
    echo $ba->decorator();
  • 相关阅读:
    java int转byte数组
    业务网关-操作手册
    业务网关-配置
    H2数据库的导入、导出(CSV)
    sequelize踩坑处理:时间格式化
    引入koa-static处理静态资源
    MySql利用case when实现批量更新多条记录的不同值实现方法
    Sequelize增删改查及批量新增或批量更新(bulkCreate的updateOnDuplicate)等常用接口
    数据结构队列、双端队列、队列系算法题解析
    配置webpack中externals来减少打包后vendor.js的体积
  • 原文地址:https://www.cnblogs.com/lzy007/p/9142728.html
Copyright © 2020-2023  润新知