利用策略模式对用户模块的一个设计

本文介绍了一种使用策略模式重构用户行为的方案。通过定义统一接口,为不同类型的用户(如新用户、VIP用户等)分配特定的行为策略,提高了系统的扩展性和灵活性。
  • 业务场景

在我们的系统中,针对用户行为,分为新用户、普通用户、vip用户、指定用户等,在业务模块中,每一个用户的行为有重合的地方,也有不同的地方。

目前,我们的设计中,将所有的用户方法放在同一个类里面,在业务层,通过switch .. case.. 语句来将某一类用户调用的方法放在一起,同时在参数里面传入用户的group,以此来实现相关的业务,但是,随着业务的调整与扩大,这个结构在维护上有一些麻烦,所以我们考虑到了重构这个业务模块。

在重构的时候,我们考虑到了使用策略模式,将业务行为定义为策略,每一个用户都有一个属于自己的策略。

  • 关于策略模式

在《java与模式》中是这样描述的:策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

所以我们认为,这个模式可以解决我们面临的问题:

1、用户的业务模块类似但是里面的行为有些许不同

2、不论是switch...case..还是if..else..,看起来扩展性不是太好

3、和用户业务相关的算法需要灵活调整

  • 程序结构设计图

113402_UGck_946290.png 

这里是一个简图,大致上我们需要实现的业务就是这样子。

通过一个接口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

转载于:https://my.oschina.net/liuke1556/blog/541930

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值