把一些相似的类,封装成统一的接口便于调用切换。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适配器模式内容请查看相关栏目,小编编辑不易,再次感谢大家的支持!