- 单一职责
- 一个类或一个方法只做一件事
- 开放封闭
- 对扩展开放对修改关闭
- 里氏替换
- 所有基类出现的地方都可以用派生类替换而不会使程序报错,子类可以扩展父类的功能但不能改变父类原有的功能
- 接口隔离
- 类不应该依赖不需要的接口知道的越少越好
- 依赖倒置
- 高级模块不应该依赖低级模块而是依赖抽象, 抽象不能依赖细节细节要依赖抽象,比如A内有类B对象称为A依赖类B但是不应该这么做而是选择类A去依赖抽象
单例模式
/**
* 单例模式 : 通过提供自身共享实例的访问
单例设计模式用于限制特定对象只能被创建一次
单例模式可以减少类的实例化
* 使用场景 : 例如数据库实例
*/
function load($class_name, $type)
{
$class_path = $this->get_class_path($class_name, $type);
$class_name = $this->get_class_name($class_name);
if (!file_exists($class_path)) {
InitPHP::initError('file' . $class_name . '.php is not exist!');
}
if (isset(self::$instance['initphp'][$class_name])) {
return self::$instance['initphp'][$class_name];
}
require_once($class_path);
if (!class_exists($class_name)) {
InitPHP::initError('class' . $class_name . ' is not exist!');
}
self::$instance['initphp'][$class_name] = new $class_name;
return self::$instance['initphp'][$class_name];
}
观察者模式
/**
* 观察者设计模式 : 能够更便利创建和查看目标对象状态的对象
并且提供和核心对象非耦合的置顶功能性。
在一般复杂的 WEB 系统中,观察者模式可以帮你减轻代码设计的压力,
降低代码耦合
* 常用场景 : 设计一个订单类 订单创建完成后,会做各种动作,比如发送 EMAIL,
或者改变订单状态等等 原始的方法,是将这些操作都写在 create 函数里面
* 但是随着订单创建类的越来越庞大,这样的操作已经无法满足需求和快速变动
*/
class order
{
// 存放观察容器
protected $observers = array();
// 新增观察者
public function addObserver($type, $observer)
{
$this->observers[$type][] = $observer;
}
// 运行观察者
public function observer($type)
{
if (isset($this->observers[$type])) {
foreach ($this->observers[$type] as $obser) {
$a = new $obser;
$a->update($this);
}
}
}
public function create()
{
echo '购买成功';
$this->observer('buy');
}
}
class orderEmail
{
public static function update($order)
{
echo '发送一个邮件';
}
}
class orderStatus
{
public static function update($order)
{
echo '改变状态';
}
}
$ob = new order();
$ob->addObServer('buy', 'orderEmail');
$ob->addObServer('buy', 'orderStatus');
$ob->create();
解释器模式
/**
* 解释器模式 : 用于分析一个实体的关键元素,并且针对每个元素提供自己的解释或相应动作
*
* 常用场景 : PHP 的模板引擎
*/
class template
{
private $left = '<!--{';
private $right = '}--!>';
public function run($str)
{
return $this->init($str, $this->left, $this->right);
}
private function init($str, $left, $right)
{
$pattern = array('/' . $left . '/', '/' . $right . '/');
$replacement = array('', '');
return preg_replace($pattern, $replacement, $str);
}
}