• php设计模式-工厂模式


    封装、继承、多态为oop的三大核心特性,我们可以根据这些特性,使用工厂模式。

    工厂模式:在有些时候,需要创建基类的子类的一个具体实例,可以通过工厂模式实现,通常一个工厂类拥有一个静态的方法,用来接收一些输入,并根据输入决定创建哪个类的实例(通常是一个子类)

    假设,我们有一个这样的需求,网站有3种用户:管理员,会员,游客,这3种用户具有不同的权限和后台管理页面,通常管理员的后台是固定的,游客和会员根据类型调用不同的页面

    1,通过oop基本的3大特性,实现用户分层,权限和后台进行定制

     1 abstract class User {
     2     protected $name = NULL;
     3     function __construct( $name ) {
     4         $this->name = $name;
     5     }
     6     function getName(){
     7         return $this->name;
     8     }
     9     function hasReadPermission(){
    10         return true;
    11     }
    12     function hasModifyPermission(){
    13         return false;
    14     }
    15     function hasDeletePermission(){
    16         return false;
    17     }
    18     function wantsFlashInterface(){
    19         return true;
    20     }
    21 }
    22 
    23 class GuestUser extends User {
    24 }
    25 
    26 class CustomerUser extends User {
    27     function hasModifyPermission(){
    28         return true;
    29     }
    30 }
    31 
    32 class AdminUser extends User {
    33     function hasModifyPermission(){
    34         return true;
    35     }
    36     function hasDeletePermission(){
    37         return true;
    38     }
    39     function wantsFlashInterface(){
    40         return false;
    41     }
    42 }

    二,通过工厂类控制创建对应的子类实例

    class UserFactory {
        private static $users = array( "ghostwu" => "admin", "lisi" => "guest", "wangwu" => "customer" );
        static function create( $name ){
            if( !isset( self::$users[$name] ) ) {
                echo $name . ",这个用户不存在" . PHP_EOL;
                return ;
            }
            switch( self::$users[$name] ){
                case "admin":
                    return new AdminUser( $name );
                case "guest":
                    return new GuestUser( $name );
                case "customer":
                    return new CustomerUser( $name );
                default:
                    return "不存在该用户类型";
            }
        }
    }

    三、结合之前的封装,完善业务

    function boolToStr( $b ){
        if( $b == true ){
            return "yes" . PHP_EOL;
        }else {
            return "no" . PHP_EOL;
        }
    }
    
    function displayPermissions( User $obj ){
        echo $obj->getName() . ",该用户权限:" . PHP_EOL;    
        echo "read:" .  boolToStr( $obj->hasReadPermission() );
        echo "modify:" . boolToStr( $obj->hasModifyPermission() );
        echo "delete:" . boolToStr( $obj->hasDeletePermission() );
    }
    
    function displayRequirements( User $obj ){
        echo "刷新后台界面:" . boolToStr( $obj->wantsFlashInterface() );
    }
    
    $logins = array( "ghostwu", "lisi", "wangwu" );
    foreach( $logins as $login ) {
        displayPermissions( UserFactory::create( $login ) );
        displayRequirements( UserFactory::create( $login ) );
        echo "----------------------------" . PHP_EOL;
    }

     

  • 相关阅读:
    Codevs1684 垃圾陷阱
    Codevs1540银河英雄传说[并查集]
    Poj1182食物链[并查集]
    树的顺序遍历的应用
    树的顺序遍历
    ARTS打卡
    定位iOS代码中崩溃的位置
    leetcode 24
    leetcode 24
    Drafter简单介绍
  • 原文地址:https://www.cnblogs.com/ghostwu/p/8461308.html
Copyright © 2020-2023  润新知