业务场景
在我们的系统中,针对用户行为,分为新用户、普通用户、vip用户、指定用户等,在业务模块中,每一个用户的行为有重合的地方,也有不同的地方。
目前,我们的设计中,将所有的用户方法放在同一个类里面,在业务层,通过switch .. case.. 语句来将某一类用户调用的方法放在一起,同时在参数里面传入用户的group,以此来实现相关的业务,但是,随着业务的调整与扩大,这个结构在维护上有一些麻烦,所以我们考虑到了重构这个业务模块。
在重构的时候,我们考虑到了使用策略模式,将业务行为定义为策略,每一个用户都有一个属于自己的策略。
关于策略模式
在《java与模式》中是这样描述的:策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
所以我们认为,这个模式可以解决我们面临的问题:
1、用户的业务模块类似但是里面的行为有些许不同
2、不论是switch...case..还是if..else..,看起来扩展性不是太好
3、和用户业务相关的算法需要灵活调整
程序结构设计图
这里是一个简图,大致上我们需要实现的业务就是这样子。
通过一个接口A,定义下来所有的业务方法。
每一类用户有一个属于自己的策略类,这个类基于接口A,实现属于自己的行为。
在业务类中,根据用户所属的用户组,调用不同的用户策略来实现用户业务。
代码demo
这个demo是基于php实现的,主要描述我们的代码结构
<?php
error_reporting(E_ALL);
/**
* Interface interfaceOfUser 所有用户的行为接口
*/
interface interfaceOfUser
{
public function userAction(); // 用户行为
}
/**
* Class newUser 新用户的行为
*/
class newUser implements interfaceOfUser
{
public function userAction()
{
/**
* 新用户的行为
*/
echo '新用户执行完毕';
}
}
/**
* Class vipUser VIP用户行为
*/
class vipUser implements interfaceOfUser
{
public function userAction()
{
/**
* vip用户的行为
*/
echo 'vip执行完毕';
}
}
class Run
{
public $userType;
public function setUserType($userType)
{
$this->userType = $userType;
}
public function getAction()
{
$object = new $this->userType;
$object->userAction();
}
}
$demo = new Run();
$demo->setUserType("vipUser");
$demo->getAction();
惯例备注
这个重构方法设计只是对策略模式在我们业务设计中的理解和实现,严格的话其实也不知道算不算正确使用了策略模式,如果有高见的话可以联络我进行各种喷:saintatgod@gmail.com