大话设计模式第二章---商场促销简单工厂模式、策略模式 PHP实现及对比

本文通过PHP代码实例,详细介绍了简单工厂模式和策略模式的结合应用,展示了如何通过创建Cash_context类来降低耦合度,并实现不同策略的灵活切换,简化了客户端代码的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂模式:

<?php
abstract class Cash_super {
    abstract public function accept_cash(float $money);
}

class Cash_normal extends Cash_super {
    public function accept_cash(float $money) {
        return $money;
    }
}

class Cash_rebate extends Cash_super {
    private $_money_rebate;
    public function __construct(float $money_rebate) {
        $this->_money_rebate = $money_rebate;
    }

    public function accept_cash(float $money) {
        return $money * $this->_money_rebate;
    }
}

class Cash_return extends Cash_super {
    private $_money_condition = 0;
    private $_money_return = 0;

    public function __construct(float $money_condition, float $money_return) {
        $this->_money_condition = $money_condition;
        $this->_money_return = $money_return;
    }
    public function accept_cash(float $money) {
        $result = $money;
        if ($money >= $this->_money_condition) {
            return $money - floor($money/$this->_money_condition) * $this->_money_return;
        }
        return $result;
    }
}

class Cash_factory {
    public static function create_cash_accept($type) : Cash_super {
        $cs = null;
        switch ($type) {
        case 'normal':
            $cs = new Cash_normal();
            break;
        case '300-100':
            $cs = new Cash_return(300, 100);
            break;
        case '0.8':
            $cs = new Cash_rebate(0.8);
            break;
        }
        return $cs;
    }
}

$csuper = Cash_factory::create_cash_accept('300-100');
$total_price = $csuper->accept_cash(30000);
echo $total_price;

(简单工厂模式UML)

 

 

策略与简单工厂模式的组合:

class Cash_context {
    private $cs = null;

    public function __construct($type) {
        switch ($type) {
        case 'normal':
            $this->cs = new Cash_normal();
            break;
        case '300-100':
            $this->cs = new Cash_return(300,100);
            break;
        case '0.8':
            $this->cs = new Cash_rebate(0.8);
            break;
        }
    }

    public function get_result($money) {
        return $this->cs->accept_cash($money);
    }
}

$cc = new Cash_context('300-100');
$total_price = 0;
$total_price = $cc->get_result(5000);
echo $total_price;

 

 

说明:

  简单工厂模式需要让客户端认识两个类。Cash_super和Cash_factory。

  策略与简单工厂结合,客户端只需要认识一个类 Cash_context,降低了耦合。

  策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法之间的耦合;

转载于:https://www.cnblogs.com/wy0314/p/4768387.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值