工厂模式

/**
* 工厂方法或者类生成对象,而不是在代码中直接new
*
* 修改类名的时候,不需要每一个实例化语句都修改
* 只需要修改对应的工厂方法
*
* Class Factory
* @package regina
*/
class Factory{ static function createDatabase(){
$db = Database::getInstance();
return $db;
}
}

单例模式

/**
* 单例模式,节省资源,一个类只能实例化一个对象
*
* 使某个类的对象仅允许创建一个
*
* 为了实现单例模式,要私有化构造函数和clone魔术方法
* Class Database
* @package regina
*/
class Database{ protected static $db;
private function __construct(){ }
private function __clone(){ } static function getInstance(){
if (self::$db){
return self::$db;
}
self::$db = new Database();
return self::$db;
}
}

注册模式

/**
* 把new出来的对象保存在静态数值中,以便全局共享
* 全局共享和交换对象
* Class Register
* @package regina
*/
class Register{
protected static $array;
static function set($name, $Obj){
echo 'Register set run....';
self::$array[$name] = $Obj;
}
static function get($name){
echo 'Register get run....';
return self::$array[$name];
} function _unset($name){
echo 'Register unset run....';
unset(self::$array[$name]);
}
}

适配器模式

/**
* 将各种截然不同的函数接口封装成统一的API
* Interface IDatabase
* @package regina
*/
interface IDatabase{
function connect($host, $username, $password, $dbname);
function query();
function close();
}
class Mysqli implements Database{
protected $conn;
function connect($host, $username, $password, $dbname){
echo 'Mysqli connect run...';
}
function query(){
echo 'Mysqli query run...';
}
function close(){
echo 'Mysqli close run...';
}
}
class Mysql implements Database{
function connect($host, $username, $password, $dbname){
echo 'Mysql connect run...';
}
function query(){
echo 'Mysql query run...';
}
function close(){
echo 'Mysql close run...';
}
}

策略模式

/**
 * 将一组特定的行为和算法封装成类,以适应默写上下文的定义。
 * 减少模块耦合
 * Class MaleStrategy
 * @package regina\Strategy
 */
 interface UserStrategy{
    public function showAd();
    public function showcategory();
}
class MaleStrategy implements UserStrategy{
    function showAd(){
        echo 'MaleStrategy showAd run ...';
    }
    function showCategory(){
        echo 'MaleStrategy showCategory run ...';
    }
}
class FemaleStrategy implements UserStrategy{
    function showAd(){
        echo 'FemaleStrategy showAd run ...';
    }
    function showCategory(){
        echo 'FemaleStrategy showCategory run ...';
    }
}
//根据参数实例化对应的对象
class Page{
    protected $strategy;
    function index(){
        $this->strategy->showAd();
        $this->strategy->showCategory();
    }
    function setStrategy(\regina\Strategy\UserStrategy $strategy){
        $this->strategy = $strategy;
    }
}
//使用的时候才会实例化
//减少模块之间的耦合
$page = new Page;
$female = new \regina\Strategy\FemaleStrategy();
$page ->setStrategy($female);
$page ->index();

观察者模式

当一个对象发生改变时,依赖他的对象会全部收到通知

interface Observer{
    function update();
}
abstract class EventGenerator{
    private $observers = array();
    //添加观察者
    function addObserver(Observer $observer){
        $this->observers[] = $observer;
    }
    //通知
    function notify(){
        foreach($this->observers as $observer){
            $observer->update();
        }
    }
}
class Event extends \regina\EventGenerator{
    function trigger(){
        //事件发生
        echo 'Event'."<br>";
        //upodate
        $this->notify();
    }
}
class Observer implements \regina\Observer{
    public function update($event_info = null){
        echo 'update'. $event_info ."<br>";
    }
}
$event = new Event();
$event->addObserver(new Observer('对象1'));
$event->addObserver(new Observer('对象2'));
$event->trigger();

装饰器模式

/**
 * 装饰模式
 * 可以动态的给行为添加一些改变
 * 而不用改变主体逻辑
 * 减少主干代码与其他细节分支的耦合
 * Class regina
 */
 interface DrawDecorator{
    public function Befor();
    public function After();
}
class Test implements DrawDecorator{
    public $test;
    function __construct($test){
        $this->test = $test;
    }
    public function befor(){
        echo 'hello '.$this->test;
    }
    public function after(){
        echo 'goodbey '.$this->test;
    }
}
 class display {
    public function show(){
    echo '正体~~~';
    }
}
class regina extends \regina\Decorator\display {
    protected $Decorators = [];
    function AddDecorator(\regina\Decorator\DrawDecorator $decorator){
        $this->Decorators[]  = $decorator;
}
    function showDecorator(){
        foreach ($this->Decorators as $Decorator){
            $Decorator->befor();
        }
        parent::show();
        foreach ($this->Decorators as $Decorator ){
            $Decorator->after();
        }
    }
}
$rs = new regina();
$rs->AddDecorator(new \regina\Decorator\Test('regina'));
$rs->showDecorator();

挖坑待填~~~~~

php—常见设计模式的更多相关文章

  1. JavaScript 中常见设计模式整理

    开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式.本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知. JavaScript 中常见设计模 ...

  2. JS中常见设计模式总结

    github: https://github.com/14glwu/FEInterviewBox/tree/master/JS%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F ...

  3. java之 ------ DAO设计模式的【具体解释】及常见设计模式的【应用】

    DAO Data Access Object(数据訪问接口) 一.场景和问题 在Java程序中.常常须要把数据持久化,也须要获取持久化的数据.可是在进行数据持久化的过程中面临诸多问题(如:数据源 不同 ...

  4. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...

  5. Golang 常见设计模式之单例模式

    之前我们已经看过了 Golang 常见设计模式中的装饰和选项模式,今天要看的是 Golang 设计模式里最简单的单例模式.单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在.根据这一特 ...

  6. 【Java基础】浅谈常见设计模式

    Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...

  7. Javascript常见设计模式解析

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  8. Golang 常见设计模式之选项模式

    熟悉 Python 开发的同学都知道,Python 有默认参数的存在,使得我们在实例化一个对象的时候,可以根据需要来选择性的覆盖某些默认参数,以此来决定如何实例化对象.当一个对象有多个默认参数时,这个 ...

  9. cocos2dx中常见设计模式

    1.单例设计模式:导演类 2.观察者模式: 被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递.  事件监听器:就是采 ...

  10. iOS 常见设计模式

    (一)代理模式/委托模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和 ...

随机推荐

  1. Lua学习笔记(1) ——语法

    1.  Lua -i main.lua -i 进入交互模式 -l 加载一个库 -e  “lua code” 直接在命令行执行lua code 2. 注释 -- This is a line comme ...

  2. LVS的体系结构

    LVS集群的体系结构 章文嵩 (wensong@linux-vs.org) 转自LVS官方资料 2002 年 4 月 本文主要介绍了LVS集群的体系结构.先给出LVS集群的通用体系结构,并讨论了其的设 ...

  3. 树莓派保持网络连接shell脚本

    源:http://www.jianshu.com/p/96aa26d165c3 (我的简书文章) 故事背景 树莓派3b现在有了板载无线网卡,可以很方便的连接到wifi.但是无线路由器不能保证永远正常工 ...

  4. Mongodb GridFS——适合大小超过16MB的文件

    一.概述 GridFS是基于mongodb存储引擎是实现的“分布式文件系统”,底层基于mongodb存储机制,和其他本地文件系统相比,它具备大数据存储的多个优点.GridFS适合存储超过16MB的大型 ...

  5. 通过 :hover 伪元素控制其他元素

    ---代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  6. codevs 2456栅栏

    传送门 2456 栅栏 2006年省队选拔赛四川  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Maste   题目描述 Description 农夫约翰打算建立一个栅 ...

  7. js 弹出QQ对话框

    首先打开下面链接,开通QQ推广. http://shang.qq.com/v3/index.html 然后在页面代码中写入 <a target="_blank" href=& ...

  8. php字符编码转换中的iconv与mb_convert_encoding用法

    iconv ( 'UTF-8' , 'GBK' , $str ); //将$str字符串 utf-8 编码转换成 gbk: 另外,5.4.0 这个版本起,字符非法时候会返回 FALSE,除非在输出字符 ...

  9. 基于IOS下的支付宝SDK的学习与使用——实现产品支付(二)

    首先本篇为作者原创,仅供学习使用,以后会不断完善,精炼.阅读之前请参考  上一篇 上一篇 中详细说明了结合官方支付宝SDK,对工程环境进行的一些配置,实现了支付,本篇重点说明一下,注意事项和原理,主要 ...

  10. java:calendar类及一些比较实用的utils(二)

    在这里将我在项目中用到的一些关于使用Calendar的utils分享出来,只是一部分,后期遇到好的通用方法会继续添加,以和大家交流学习,如果你还不熟悉这个类的使用,但是急需某个util,可以加群:41 ...