php设计模式(二)结构

适配器模式(Adapter):结合两个不兼容的接口。GoF定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

<?php
class message{
    public function send(){
        echo 'fa xiao ix';
    }
    public function push(){
        echo 'tui xiao xi';
    }
}

class jiguang{
    public function sendMsg(){
        echo 'ji guang';
    }
    public function pushMsg(){
        echo 'jiguang push';
    }
}

class jiguangAdpter extends message{
    public $message;
    public function __construct()
    {
        $this->message = new jiguang;
    }

    public function send(){
        $this->message->sendMsg();
    }

    public function pushMsg(){
        $this->message->pushMsg();
    }
}

$jiguangAd = new jiguangAdpter();
$jiguangAd->send();

桥接模式(Bridge):通过封装一个抽象的接口,使得实现和抽象可以独立变化。GoF定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

在程序世界中,其实就是组合/聚合的代名词。为什么这么说呢?熟悉面向对象的我们都知道继承的好处,子类可以共享父类的很多属性、功能。但是,继承也会带来一个问题,那就是严重的耦合性。父类的修改多少都会对子类产生影响,甚至一个方法或属性的修改都有可能让所有子类都去修改一遍。这样就违背了开放封装原则。而桥接就是为了解决这个问题,它强调的是用组合/聚合的方式来共享一些能用的方法。相信大家一定想到了php中的trait,如果你在工作中使用过这个特性,那么你就已经用过桥接模式了!

<?php
//桥接模式
interface MessageTemplate
{
    public function GetTemplate();
}

class LoginMessage implements MessageTemplate{
    public function GetTemplate()
    {
        echo 'denglu duanxin';
    }
}
class RegMessage implements MessageTemplate{
    public function GetTemplate(){
        echo 'zhuce duanxin';
    }
}

abstract class MessageService{
    public $template;
    public function __construct($template){
        $this->template = $template;
    }
    // abstract public function send();
}

class AliService extends MessageService{
    public function Send()
    {
        $this->template->GetTemplate();
    }
}

$login = new LoginMessage();
$reg = new RegMessage();

$al = new AliService($login);
$al->send();

组合模式(Composite):创建对象组的树形结构,使得单个对象和组合对象具有一致性。GoF定义:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性

购物车商品计算用这个模式比较好:https://blog.csdn.net/qq_22823581/article/details/129439561

装饰器模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。

装饰这两个字,我们暂且把他变成化妆。首先你得有一张脸,然后打底,然后上妆,可以早上来个淡妆上班,也可以下班的时候补成浓妆出去嗨。当然,码农们下班的时间点正好是能赶上夜场的下半场的。话说回来,不管怎么化妆,你的脸还是你的脸,有可能可以化成别人不认识的另一个人,但这的的确确还是你的脸。这就是装饰器,对对象(脸)进行各种装饰(化妆),让这个脸更好看(增加职责)。

<?php
//奶茶
interface MilkTea{
    public function getPrice();
    public function getName();
}
//具体奶茶类
class OOlong implements MilkTea{
    public function getPrice()
    {
        return 10;   
    }
    public function getName()
    {
        return '声声乌龙';
    }
}

class Natie implements MilkTea{
    public function getPrice()
    {
        return 5;   
    }
    public function getName()
    {
        return '幽兰拿铁';
    }
}

//加料类基类
class Decorator implements MilkTea{
    public $milkTea;
    public function __construct(MilkTea $milkTea)
    {
        $this->milkTea = $milkTea;        
    }
    public function getPrice()
    {
        if($this->milkTea != null){
            return $this->milkTea->getPrice();
        }
         
    }
    public function getName()
    {
        if($this->milkTea != null){
            return $this->milkTea->getName();
        }    
    }
}

// 奶油
class Cream extends Decorator{
    public function getPrice()
    {
        return $this->milkTea->getPrice() + 5;
    }
    public function getName()
    {
        return $this->milkTea->getName() . '+奶油';
    }
}

//
class Water extends Decorator{
    public function getPrice()
    {
        return $this->milkTea->getPrice() + 2;
    }
    public function getName()
    {
        return $this->milkTea->getName() . '+水';
    }
}


//开心果
class Pistachio extends Decorator{
    public function getPrice()
    {
        return $this->milkTea->getPrice() + 10;
    }
    public function getName()
    {
        return $this->milkTea->getName() . '+开心果';
    }
}

$Natie = new Natie();
$cream = new Cream($Natie);
$pistachio = new Pistachio($cream);

echo $pistachio->getName();
echo '   ' . $pistachio->getPrice() . '' . PHP_EOL;

 


外观模式(Facade):为复杂的模块或子系统提供可以访问的接口,并且隐藏了内部的复杂性。这个模式其实是很简单的

class SubSystemOne
{
    public function MethodOne()
    {
        echo '子系统方法一', PHP_EOL;
    }
}
class SubSystemTwo
{
    public function MethodTwo()
    {
        echo '子系统方法二', PHP_EOL;
    }
}
class SubSystemThree
{
    public function MethodThree()
    {
        echo '子系统方法三', PHP_EOL;
    }
}
class SubSystemFour
{
    public function MethodFour()
    {
        echo '子系统方法四', PHP_EOL;
    }
}
class Facade
{

    private $subStytemOne;
    private $subStytemTwo;
    private $subStytemThree;
    private $subStytemFour;
    public function __construct()
    {
        $this->subSystemOne = new SubSystemOne();
        $this->subSystemTwo = new SubSystemTwo();
        $this->subSystemThree = new SubSystemThree();
        $this->subSystemFour = new SubSystemFour();
    }

    public function MethodA()
    {
        $this->subSystemOne->MethodOne();
        $this->subSystemTwo->MethodTwo();
    }
    public function MethodB()
    {
        $this->subSystemOne->MethodOne();
        $this->subSystemTwo->MethodTwo();
        $this->subSystemThree->MethodThree();
        $this->subSystemFour->MethodFour();
    }
}
$facade = new Facade();
$facade->MethodA();
$facade->MethodB();


享元模式(Flyweight):通过共享技术有效地支持大量细粒度的对象。就是共享某些元素

<?php
//享元模式
interface Flyweight{
    public function operation($shareObj);
}

class share implements Flyweight{
    public $key = 100;
    public function operation($shareObj)
    {
        return $shareObj + 100;
    }
}
//不分享的东西
class unShare implements Flyweight{
    private $key = 200;
    public function operation($shareObj)
    {
        return $shareObj + $this->key;
    }
}

class Fac{
    private $fly = [];
    public function getFlyweight($key){
        if(!isset($Fly[$key])){
            $this->fly[$key] = new share();
        }else{
            return $this->fly[$key];
        }
    }
}

$f = new Fac();
$a = $f->getFlyweight('a');
$b = $f->getFlyweight('b');
$c = $f->getFlyweight('c');

$tmp = 12;
$a->operation($tmp);

$un = new unShare();
$un->operation($tmp);

 

代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

interface Subject
{
    public function Request();
}

class RealSubject implements Subject
{
    function Request()
    {
        echo "真实的操作", PHP_EOL;
    }
}

class Proxy implements Subject
{
    private $realSubject;

    public function __construct()
    {
        $this->realSubject = new RealSubject();
    }

    public function Request()
    {
        echo "代理的操作", PHP_EOL;
        $this->realSubject->Request();
    }
}

$proxy = new Proxy();
$proxy->Request();

 

posted on 2024-10-10 17:15  朽木大叔  阅读(5)  评论(0编辑  收藏  举报

导航