设计模式总结(实践篇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 协议》,转载必须注明作者和本文链接