0%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php

/**
* Describe: 图片转base64
* 使用方法: php imgtobase64.php path=/www/projects/test/20220623171931.png
* Author: ZhaoGuibin
* Date: 2022-06-23
*/
class ImgToBase64
{
static private $instance;

private function __construct()
{
}

static public function getInstance()
{
if (!self::$instance instanceof self) {
self::$instance = new self();
}
return self::$instance;
}

/**
* 获取命令行输入参数
* @return array
*/
function getClientArgs()
{
global $argv;
array_shift($argv);
$args = array();
array_walk($argv, function ($v, $k) use (&$args) {
@list($key, $value) = @explode('=', $v);
$args[$key] = $value;
});
return $args;
}

/**
* 图片转为base64
* @param $img_path
* @return string|void
*/
function imgToBase64($img_path = '')
{
$img = isset($img_path['path']) ? $img_path['path'] : '';
if (!$img) {
return '图片不存在或图片路径不正确';
}

if ($fp = fopen($img, "rb", 0)) {
$image = fread($fp, filesize($img));
fclose($fp);

$base64 = chunk_split(base64_encode($image));
// 输出
$encode = 'data:image/jpg/png/gif;base64,' . $base64;
echo $encode;
}
}

private function __clone()
{
}
}

$img_path = ImgToBase64::getInstance()->getClientArgs();
ImgToBase64::getInstance()->imgToBase64($img_path);

阅读全文 »

1. 概念 迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。 2. 说明 * 迭代器模式(Iterator),又叫做游标(Cursor)模式,提供一种方法访问一个容器(Container)对象中各个元素,而又不需要暴露该对象的内部细节。 * 当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器
阅读全文 »

1. 概念 * 将一个请求封装(命令的封装)为一个对象,从而使用你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 * 命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。 * 请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。 2. 角色 * 命令(command)角色:声明了一个给所有具体命令类
阅读全文 »

1. 概念 * 观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 * 当一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式。 * 观察者模式符合接口隔离原则,实现了对象之间的松散耦合。 2. 角色 * 抽象主题(subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。 * 具体主题(ConcreteSubjest):将有关状态存入具体观察者对象;在具体
阅读全文 »

1. 概念 * 将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,并让它们可以相互替换,这种模式就是策略模式。 * 简单理解就是 有n个做法供你选择,根据你的需要选择某个策略得到结果 2. 优点 * 使用设计模式之后,我们的代码冗余和耦合度变低,每个策略模块完成对应的功能。 * 当然缺点就是一个功能我们就要响应制作一个策略类,但是我们统观MVC架构当中(Thinkphp,Yii2),一个控制器对应一个视图,其实也是策略模式的体现了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
阅读全文 »

  1. 概念

    装饰器模式又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

  2. 实例

    • 组件对象的接口:可以给这些对象动态的添加职责
    • 所有装饰器的父类:需要定义一个与组件接口一直的接口,并持有一个component对象,该对象其实就是被装饰的对象。
    • 具体的装饰器类:实现具体要向被装饰对象添加的功能。用来装饰具体的组件对象或者另外一个具体的装饰器对象。
  3. 使用场景

    • 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
    • 需要添加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
    • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
    //组件对象接口
    interface IComponent
    {
    //动态给对象添加功能
    public function display();
    }

    //待装饰的对象
    class Person implements IComponent
    {
    protected $name;
    public function __construct($name)
    {
    $this->name = $name;
    }

    public function display()
    {
    echo '装饰的' . $this->name;
    }
    }

    //所有装饰器的父类
    class Clothes implements IComponent
    {
    protected $component;
    public function Decorate(IComponent $component)
    {
    $this->component = $component;
    }

    public function display()
    {
    if (!empty($this->component)) {
    $this->component->display();
    }
    }
    }

    //具体的装饰器
    class Pixie extends Clothes
    {
    public function display()
    {
    echo '皮鞋';
    parent::display();
    }
    }

    class Waitao extends Clothes
    {
    public function display()
    {
    echo '外套';
    parent::display();
    }
    }

    //客户端
    $gd = new Person('狗蛋');
    $px = new Pixie();
    $px->Decorate($gd);
    $px->display();

    $wt = new Waitao();
    $wt->Decorate($gd);
    $wt->display();
阅读全文 »

1. 概念 注册树模式也叫注册模式或注册器模式,顾名思义,注册树就是把对象实例注册到一棵全局的对象树上,需要对象的时候就从树上取下来,就好比树上长的果子,需要的时候就摘一个下来,只是这个对象树果子是摘不完的。 2. 作用 不管是单例模式还是工厂模式建立的对象,都没有得到很好的管理,用了注册树模式,就可以把创建出来的对象注册到全局树上,需要的时候取下来用,可以很好的管理创建的对象。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
阅读全文 »

1. 概念 门面模式(facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用;引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。 2. 作用 * 为一些复杂的子系统提供一组接口。 * 提高子系统的独立性 * 在层次化结构中,可以使用门面模式定义系统的每一层的接口 3. 优点 * 它对于客户屏蔽了子系统组件,因而减少了客户处理的对象
阅读全文 »

1. 概念 管道(pipeline)设计模式流水线模式就是将数据传递到一个任务序列中,管道扮演着流水线的角色,数据在这里被处理然后传递到下一个步骤 2. 释义 * 管道,顾名思义,就是一个长长的流水管道,只不过加了许多阀门。所以管道模式大致需要三个角色:管道、阀门、载荷(流水)。 * 目的是在管道中对载荷进行一系列的处理。因为可以对过滤器进行动态的添加,所以对载荷的处理可以变得更加灵活。但同时带来的问题是,在过滤器过多时,很难把握整体的处理逻辑。而且在某一个过滤器对载荷处理后,因为载荷改变,会
阅读全文 »

1. 概念 构建了透明置于两个不同对象之内的一个对象,从而能够截取或代理这两个对象间的通信或访问。 2. 应用场景 * 远程代理:也就是为了一个对象在不同地址空间提供局部代表。隐藏一个对象存在于不同地址空间的事实。 * 虚拟代理:根据需求来创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。 * 安全代理:用来控制真实对象的访问对象。 * 智能指引:当调用真实对象的时候,代理处理一些事情。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
阅读全文 »