zoukankan      html  css  js  c++  java
  • PHP设计模式笔记

    一、工厂模式:减少new的使用,定义一个类,专门用来创建其它对象
    例:

    class A{
        static function create(){
            return new DB();
        }
    }
    $db = A::create();

    二、单例模式:确保一个类只有一个实例
    使用场景:缓存、日志对象、数据库操作只有一个实例。
    缺点:
    1. 难于调试
    2. 隐藏的依赖关系
    例:

    class A {
        //静态变量保存全局实例
        private static $_init = null;
        //私有构造函数,防止外部实例化对象
        private function __construct(){
            
        }
        //私有克隆函数,防止外部克隆对象
        private function __clone(){
            
        }
        //静态方法,单例统一访问入口
        public static function getInit(){
            if (!isset(self::$_init)){
                self::$_init = new self();
            }
            return self::$_init;
        }
        
        public function test(){
            echo '调用方法成功';
        }
    }
    
    $a = A::getInit();
    $a->test();
     

    三、策略模式:把特定行为封装成类,适应特定的环境
    使用场景:电商男装女装
    例:

     
    //抽象策略接口
    interface A{
        public function show();
    }
    //用于客户端是IE时调用的类(环境角色)
    class IE implements  A {
        public function show(){
            return 'ie';
        }
    }
    //用于客户端不是firefox时调用的类(环境角色)
    class FF implements  A {
        public function show(){
            return 'firefox';
        }
    }
    //具体策略角色
    class U {
        public function index($obj){
            echo $obj->show();
        }
    }
    
    $user = new U();
    $user->index(new FF);
     

    四、观察者模式:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
    使用场景:事件系统
    缺点:性能降低
    例:

     
    //定义观察者接口
    interface Looker {
        public function news($user);//定义接收通知的方法
    }
    //定义被观察事件的接口
    interface Event {
        public function add($obj);//定义被观察事件的方法
        public function notify($user);//定义通知所有观察者的方法
    }
    //被观察事件
    class E1 implements Event {
        protected $obj = array();
        
        public function add($obj){//被观察事件
            $this->obj[] = $obj;
        }
        
        public function notify($user){//通知所有观察者
            foreach($this->obj as $o){
                $o->news($user);
            }
        }
    }
    //观察者
    class L1 implements Looker {
        public function news($user){//接收通知
            echo $user.'有新动态<br>';
        }
    }
    $event1 = new E1;
    $event1->add(new L1);
    $event1->notify('小明');
    $event1->notify('小红');
    $event1->notify('小李');
     

    五、适配器模式:把各种不同的类封装成同一接口
    使用场景:数据库mysql,mysqli。缓存memcache,redis,file。可以用适配器模式统一成一致

    六、装饰者模式:可以动态的添加修改类的功能
    例:

     
    abstract class Beverage{
        public $_name;
        abstract public function Cost();
    }
    //被装饰者类
    class Coffee extends Beverage{
        public function __construct(){
            $this->_name = 'Coffee';
        }
    
        public function Cost(){
            return 1.00;
        }
    }
    // 以下三个类是装饰者相关类
    class CondimentDecorator extends Beverage{
        public function __construct(){
            $this->_name = 'Condiment';
        }
    
        public function Cost(){
            return 0.1;
        }
    }
    //2.加点牛奶
    class Milk extends CondimentDecorator{
        public $_beverage;
    
        public function __construct($beverage){
            $this->_name = 'Milk';
    
            if($beverage instanceof Beverage){
                $this->_beverage = $beverage;
            }else{
                die('Failure');
            }
        }
    
        public function Cost(){
            return $this->_beverage->Cost() + 0.2;
        }
    }
    //3.加点糖
    class Sugar extends CondimentDecorator{
        public $_beverage;
    
        public function __construct($beverage){
            $this->_name = 'Sugar';
    
            if($beverage instanceof Beverage){
                $this->_beverage = $beverage;
            }else{
                exit('Failure');
            }
        }
    
        public function Cost(){
            return $this->_beverage->Cost() + 0.2;
        }
    }
    
    //1.拿杯咖啡
    $coffee = new Coffee();
    //2.加点牛奶
    $coffee = new Milk($coffee);
    //3.加点糖
    $coffee = new Sugar($coffee);
    
    printf("Coffee Total:%0.2f元
    ",$coffee->Cost());
     
  • 相关阅读:
    (转)关于c#中的事件
    MySql数据库--持续记录ing
    在Eclipse中通过JDBC连接MySQL步骤,非常详细!
    mybatis传入参数类型parameterType和输出结果类型resultType详解
    关于JDBC访问存储过程的问题
    Mybatis(一)入门
    [Redis] 基于redis的分布式锁
    分布式锁----浅析redis实现
    MyBatis的增删改查操作
    C3P0连接池工具类实现步骤及方法
  • 原文地址:https://www.cnblogs.com/quanzhiguo/p/7157678.html
Copyright © 2011-2022 走看看