设计模式总结(实践篇1)

实践出真理

在前面总结的两篇设计模式相关的知识内容,对于如何规范代码,编写代码有了一个比较清晰的了解,在编写代码中,也会刻意代码应该如何编写,而不是像挤面条似的把代码功能逻辑写成一堆。

需求

以下是我根据最近接到的一个新需求去修改的代码。需求是在原本的活动下,修改扩充更多的活动类型,原先的需求只有固定的活动(如买一送一,买二送一,第二件享受折扣),如果要设置买一送二等就不能实现,对此,需要将原先的活动大改,将活动分为5种类型(满足活动满减,满足活动折扣,买x件送x件,一口价活动,第x件享受活动)。这样使运营在配置活动时,想要配置怎样的活动都可以得到满足。

需求分析

这里只写了大致思路和伪代码。

对于每一个活动类型,都需要校验活动类型是否合法,是否达到活动的使用条件和活动优惠价格,可以作为公共部分抽离出来。对此我创建了一个活动接口类。

//活动接口类
interface ActivityInterface
{
    //校验活动类型合法性
    public function verify();

    //是否满足活动使用条件
    public function available();

    //计算活动优惠金额
    public function calculation();
}

由于存在五种不同类型,这里创建五个不同的活动类去继承接口,并分别实现接口的方法。

//满减类型活动类
class SubTypeActivity implements ActivityInterface
{
     //校验活动类型合法性
    public function verify(){
        //方法实现
    };
    //是否满足活动使用条件
    public function available(){
        //方法实现
    };
    //计算活动优惠金额
    public function calculation(){
        //方法实现
    };
}

//折扣类型活动类
class DiscountTypeActivity implements ActivityInterface
{
    //校验活动类型合法性
    public function verify(){
        //方法实现
    };
    //是否满足活动使用条件
    public function available(){
        //方法实现
    };
    //计算活动优惠金额
    public function calculation(){
        //方法实现
    };
}

//指定折扣类型活动类
class AppointDiscountTypeActivity implements ActivityInterface
{
    //校验活动类型合法性
    public function verify(){
        //方法实现
    };
    //是否满足活动使用条件
    public function available(){
        //方法实现
    };
    //计算活动优惠金额
    public function calculation(){
        //方法实现
    };
}

//赠送类型活动类
class GivingTypeActivity implements ActivityInterface
{
    //校验活动类型合法性
    public function verify(){
        //方法实现
    };
    //是否满足活动使用条件
    public function available(){
        //方法实现
    };
    //计算活动优惠金额
    public function calculation(){
        //方法实现
    };
}

//一口价类型活动类
class BuyoutTypeActivity implements ActivityInterface
{
    //校验活动类型合法性
    public function verify(){
        //方法实现
    };
    //是否满足活动使用条件
    public function available(){
        //方法实现
    };
    //计算活动优惠金额
    public function calculation(){
        //方法实现
    };
}

这里创建完成五个活动类后,对于各个不同的活动类的调用,如果是用过程式的方式去编写代码,代码耦合度和可读性会很差,对此我创建了一个ActivityFactoryService活动工厂服务类。在该类上实现不同活动类的调用和访问控制。以下是活动工厂服务类的相关代码,后续如果需要新增其他的活动类型,只需要新增活动类,并在getActivityFactory方法中添加新的if分支,当然活动类型应该不会太多,所以我这里就使用ifelse去判断。

class ActivityFactoryService implements ActivityInterface
{
    protected $service;

    public function __construct($activity)
    {
        $this->getActivityFactory($activity);
    }

    /**
     * 使用工厂模式得到不同类型活动类
     * @param $activity
     * @throws \Exception
     */
    public function getActivityFactory($activity)
    {
        //这里使用了枚举类,枚举了所有活动类型去判断
        if ($activity->type == ActivityType::SUB_TYPE){
            //满减类型
            $this->service = new SubTypeActivity($activity);
        }else if ($activity->type == ActivityType::ALL_DISCOUNT_TYPE){
            //折扣类型
            $this->service = new DiscountTypeActivity($activity);
        }else if ($activity->type == ActivityType::APPOINT_DISCOUNT_TYPE){
            //指定折扣类型
            $this->service = new AppointDiscountTypeActivity($activity);
        }else if ($activity->type == ActivityType::GIVING_TYPE){
            //赠送类型
            $this->service = new GivingTypeActivity($activity);
        }else if ($activity->type == ActivityType::BUYOUT_TYPE){
            //一口价类型
            $this->service = new BuyoutTypeActivity($activity);
        }

        if (!$this->service){
            throw new \Exception('活动类型错误');
        }
    }
    //校验活动类型合法性
    public function verify()
    {
        return $this->service->verify();
    }
    //是否满足活动使用条件
    public function available()
    {
        return $this->service->available();
    }
    //计算活动优惠金额
    public function calculation()
    {
        return $this->service->calculation();
    }
}

以上是我对于一个新需求的相关分析,并对实现代码进行处理的一个过程。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!