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);
    }
 
}

调用:

<?php

$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);
    }
    
    // ...
    
}

到此这篇关于PHP适配器模式就介绍到这了。健康没有捷径,来自点滴习惯的养成;养生只能自学,随时保持学习的状态。更多相关PHP适配器模式内容请查看相关栏目,小编编辑不易,再次感谢大家的支持!

标签: PHP