PHP实现11中常见的设计模式

1 工厂模式

  • 使用工厂方法或者类生成对象,而不是在代码中直接new
class Person
{
    public string $age;
    public string $name;

    public function study()
    {
    }

    public function eat()
    {
    }

    public function sleep()
    {
    }

    public function work()
    {
    }
}

class Factory
{
    public static function instancePerson(): Person
    {
        return new Person();
    }
}

2 单例模式

  • 类对象仅允许创建一个

  • 构造方法声明为私有

class Database
{

    private static $db;

    private function __construct()
    {

    }

    static function getInstance(): Database
    {
        if (!self::$db) {
            self::$db = new self();
        }
        return self::$db;
    }
}

3 注册模式

  • 全局共享和交换对象
class Register
{
    protected static $object;

    static function set($alis, $obj)
    {
        self::$object[$alis] = $obj;
    }

    static function get($alis)
    {
        return self::$object[$alis];
    }

    static function unset($alis)
    {
        unset(self::$object[$alis]);
    }
}

class Person
{
    public string $age;
    public string $name;

    public function study()
    {
    }

    public function eat()
    {
    }

    public function sleep()
    {
    }

    public function work()
    {
    }
}
$person = new Person();
Register::set(Person::class, $person);

4 适配器模式

  • 将不同的函数接口封装成统一的API,比如:

  • 数据库适配器:mysql、mysqli、pdo

  • 缓存适配器:file、redis、memcache

interface DatabaseInterface
{
    public function connect();

    public function query();

    public function insert();

    public function update();

    public function delete();
}

class DiyMysqli implements DatabaseInterface
{

    public function connect()
    {
        // TODO: Implement connect() method.
    }

    public function query()
    {
        // TODO: Implement query() method.
    }

    public function insert()
    {
        // TODO: Implement insert() method.
    }

    public function update()
    {
        // TODO: Implement update() method.
    }

    public function delete()
    {
        // TODO: Implement delete() method.
    }
}

class DiyPDO implements DatabaseInterface
{

    public function connect()
    {
        // TODO: Implement connect() method.
    }

    public function query()
    {
        // TODO: Implement query() method.
    }

    public function insert()
    {
        // TODO: Implement insert() method.
    }

    public function update()
    {
        // TODO: Implement update() method.
    }

    public function delete()
    {
        // TODO: Implement delete() method.
    }
}

5 策略模式

  • 将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,比如首页根据不同活动来展示不同的广告。
/**
 * 策略接口
 */
interface AdvStrategyInterface
{
    public function showAdv();
}

/**
 * 秒杀广告
 */
class SeckillAdvStrategy implements AdvStrategyInterface
{
    public function showAdv()
    {
        // TODO: Implement showAdv() method.
    }
}

/**
 * 促销广告
 */
class PromotionAdvStrategy implements AdvStrategyInterface
{
    public function showAdv()
    {
        // TODO: Implement showAdv() method.
    }
}

/**
 * 电商系统
 */
class System
{
    /**
     * @var AdvStrategyInterface
     */
    protected $strategy;

    /**
     * 首页展现位
     */
    public function index()
    {
        $this->strategy->showAdv();
    }

    /**
     * 设置策略
     * @param AdvStrategyInterface $strategy
     */
    public function setStrategy(AdvStrategyInterface $strategy)
    {
        $this->strategy = $strategy;
    }
}
$system = new System();
$system->setStrategy(new SeckillAdvStrategy());
$system->index();

6 数据对象映射模式(ORM)

  • 将对象和数据存储映射起来,对一个对象的操作会映射为堆数据存储的操作
class UserModel
{
    public int $id;
    public string $name;
    public string $age;
    public string $address;

    public function __construct(int $id)
    {
        // 初始化数据
    }

    public function __destruct()
    {
        // 更新数据
    }
}
$user = new UserModel(1);
$user->name = 'new name';
$user->name = 22;
$user->address = 'new address';

7 观察者模式

  • 当对象状态发生变化时,依赖它的对象会收到通知,并自动更新,实现了低耦合,非侵入式的通知与更新机制。
/**
 * 观察者接口
 */
interface Observer
{
    public function update();
}

/**
 * 更新事件观察者
 */
class UpdateEventObserver implements Observer
{
    public function update()
    {
        // TODO: Implement update() method.
    }
}

/**
 * 添加事件观察者
 */
class AddEventObserver implements Observer
{
    public function update()
    {
        // TODO: Implement update() method.
    }
}

/**
 * 事件生成器
 */
abstract class EvenGenerator
{
    private array $observer = [];

    public function add(Observer $observer)
    {
        $this->observer[] = $observer;
    }

    public function notify()
    {
        foreach ($this->observer as $observer) {
            $observer->update();
        }
    }
}

/**
 * 特定事件
 */
class Event extends EvenGenerator
{
    public function trigger()
    {
        $this->notify();
    }
}

$e = new Event();
$e->add(new AddEventObserver());
$e->add(new UpdateEventObserver());
$e->notify();

8 原型模式

  • 与工厂模式作用类似,都是用来创建对象

  • 与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去类创建时的重复的初始化操作。

  • 原型模式适用于大对象的创建,创建一个大的对象需要很大的开销,如果每次new就会消耗很大,而原型模式仅需内存拷贝即可。

class Person
{
    public string $age;
    public string $name;

    public function study()
    {
    }

    public function eat()
    {
    }

    public function sleep()
    {
    }

    public function work()
    {
    }
}
$person1 = new Person();
$person2 = clone $person1;

9 装饰器模式

  • 可以动态的修改类的功能。

  • 一个类提供了一项功能,如果在修改并添加额外的功能,传统的编码模式,需要写一个子类继承它,并重新实现类的方法。

  • 仅需在运行时添加一个装饰器对象即可实现,可以实现最大化的灵活性。

/**
 * 装饰器接口
 */
interface DecoratorInterface
{
    public function before();

    public function after();
}

/**
 * 家具装饰器
 */
class FurnitureDecorator implements DecoratorInterface
{

    public function before()
    {
        // TODO: Implement before() method.
    }

    public function after()
    {
        // TODO: Implement after() method.
    }
}

/**
 * 房子
 */
class House
{
    protected array $decorator;

    /**
     * 添加装饰器
     *
     * @param DecoratorInterface $decorator
     */
    public function addDecorator(DecoratorInterface $decorator)
    {
        $this->decorator[] = $decorator;
    }

    /**
     * 销售前
     */
    public function before()
    {
        foreach ($this->decorator as $decorator) {
            $decorator->before();
        }
    }

    /**
     * 销售后
     */
    public function after()
    {
        $this->decorator = array_reverse($this->decorator);
        foreach ($this->decorator as $decorator) {
            $decorator->after();
        }
    }

    /**
     * 销售房子
     */
    public function sale()
    {
        $this->before();
        // 业务代码
        $this->after();
    }
}
$house = new House();
$house->addDecorator(new FurnitureDecorator());
$house->sale();

10 迭代器模式

  • 在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。

  • 相比于传统的编码模式,迭代器模式可以隐藏遍历元素的所需的操作。

class NewIterator implements Iterator{

    public function current()
    {
        // TODO: Implement current() method.
    }

    public function next()
    {
        // TODO: Implement next() method.
    }

    public function key()
    {
        // TODO: Implement key() method.
    }

    public function valid()
    {
        // TODO: Implement valid() method.
    }

    public function rewind()
    {
        // TODO: Implement rewind() method.
    }
}

11 代理模式

  • 在客户端与实体之间建立一个代理对象,客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节。
  • 代理还可以与业务代码分离,部署到另外的服务器,业务代码中通过RPC来委派。
interface UserProxy
{
    public function get(int $id);
}

class Proxy implements UserProxy
{
    public function get(int $id)
    {
        // TODO: Implement get() method.
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值