設計模式總結(實踐篇1)

oliver-l發表於2020-11-05

實踐出真理

在前面總結的兩篇設計模式相關的知識內容,對於如何規範程式碼,編寫程式碼有了一個比較清晰的瞭解,在編寫程式碼中,也會刻意程式碼應該如何編寫,而不是像擠麵條似的把程式碼功能邏輯寫成一堆。

需求

以下是我根據最近接到的一個新需求去修改的程式碼。需求是在原本的活動下,修改擴充更多的活動型別,原先的需求只有固定的活動(如買一送一,買二送一,第二件享受折扣),如果要設定買一送二等就不能實現,對此,需要將原先的活動大改,將活動分為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 協議》,轉載必須註明作者和本文連結

相關文章