阅读模式:

php适配器模式

查看:1955  :0  类型:  来源:php自学网  标签 php设计模式

    把一些相似的类,封装成统一的接口便于调用切换。php适配器模式会定义一个接口,接口中定义需要实现的方法,多个子类去实现这些方法的过程。

    优点:如果需要封装一个缓存类,缓存类同时支持redis和memcache,切换使用时只需修改相关配置就能实现切换了,而不需要修改大量的代码。减少代码间的耦合,可以方便增减需要实现的类。

一、适配器模式

  Adapter.php

<?php

interface Adapter
{
    public function connect();
    public function get();
    public function set();
    public function del();
}

  redis.php

<?php

class RedisAdapter implements Adapter
{
    private $redis;

    protected function __construct()
    {
        $this->connect();
    }

    /**
     * 连接redis
     */
    protected function connect(): void
    {
        $this->redis = new Redis();
        $this->redis->connect('127.0.0.1', 6379);
    }

    /**
     * 获取
     * @param string $key
     * @return string
     */
    public function get(string $key): string
    {
        return $this->redis->get($key);
    }

    /**
     * 设置key值
     * @param string $key
     * @param string $value
     * @param int $ttl
     * @return int
     */
    public function set(string $key, string $value, int $ttl = 3600): int
    {
        return $this->redis->setex($key, $ttl, $value);
    }

    /**
     * 删除key
     * @param string $key
     * @return int
     */
    public function del(string $key): int
    {
        return $this->redis->delete($key);
    }

}

  memcache.php

<?php

class MemcacheAdapter implements Adapter
{
    private $memcache;

    protected function __construct()
    {
        $this->connect();
    }

    /**
     * 连接redis
     */
    protected function connect(): void
    {
        $this->memcache = memcache_connect('127.0.0.1', 11211);
    }

    /**
     * 获取
     * @param string $key
     * @return string
     */
    public function get(string $key): string
    {
        return $this->memcache->get($key);
    }

    /**
     * 设置key值
     * @param string $key
     * @param string $value
     * @param int $ttl
     * @return boolean
     */
    public function set(string $key, string $value, int $ttl = 3600): bool
    {
        return $this->memcache->setex($key, $value, MEMCACHE_COMPRESSED, $ttl);
    }

    /**
     * 删除key
     * @param string $key
     * @return boolean
     */
    public function del(string $key): bool
    {
        return $this->memcache->delete($key, 0);
    }

}

  调用:

$cacheType = 'redis'; // 切换时只需修改这里的配置,其他代码不变。
if ($cacheType == 'redis') {
    $cache = new RedisAdapter(); 
} else {
    $cache = new MemcacheAdapter();
}

$cache->get('test');
$cache->set('test', 123, 3600);
$cache->del('test');

二、适配器模式的应用

  tp6中的应用

  缓存类的具体实现在\think\cache\driver\目录中。

/**
 * 缓存管理类
 * @mixin Driver
 * @mixin \think\cache\driver\File
 */
class Cache extends Manager implements CacheInterface
{
    protected $namespace = '\\think\\cache\\driver\\';
    
   /**
    * 读取缓存
    * @access public
    * @param string $key     缓存变量名
    * @param mixed  $default 默认值
    * @return mixed
    */
    public function get($key, $default = null)
    {
        return $this->store()->get($key, $default);
    }

    /**
     * 写入缓存
     * @access public
     * @param string        $key   缓存变量名
     * @param mixed         $value 存储数据
     * @param int|\DateTime $ttl   有效时间 0为永久
     * @return bool
     */
    public function set($key, $value, $ttl = null): bool
    {
        return $this->store()->set($key, $value, $ttl);
    }

    /**
     * 删除缓存
     * @access public
     * @param string $key 缓存变量名
     * @return bool
     */
    public function delete($key): bool
    {
        return $this->store()->delete($key);
    }
    
    // ...
    
}
分享到:
2 2

我的看法:

IN: