文档章节

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

saintatgod
 saintatgod
发布于 2015/12/10 11:47
字数 748
阅读 77
收藏 0
  • 业务场景

在我们的系统中,针对用户行为,分为新用户、普通用户、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

© 著作权归作者所有

saintatgod
粉丝 20
博文 32
码字总数 10455
作品 0
东城
程序员
私信 提问
加载中

评论(3)

saintatgod
saintatgod 博主

引用来自“saintatgod”的评论

引用来自“子_不语”的评论

最下面错了
求指点

@子_不语 可不可以具体说说,设计模式这个我不是很懂
saintatgod
saintatgod 博主

引用来自“子_不语”的评论

最下面错了
求指点
子_不语
子_不语
最下面错了
六个前端开发工程师必备的Web设计模式/模块资源

Yahoo的设计模式库 Yahoo的设计模式库包含了很多可以帮助开发设计人员解决遇到的问题的资源,包括开发中常常需要处理的导航,互动效果及其布局网格等大家常用的组件和模块 响应式设计模式库 ...

gbin1
2014/07/30
13
0
JavaScript 常见设计模式

前言 设计模式,这一话题一直都是程序员谈论的"高端"话题之一。许多程序员从设计模式中学到了设计软件的灵感和解决方案。 有人认为设计模式只在 C++或者 Java 中有用武之地,JavaScript 这种...

YeeWang王大白
03/08
0
0
设计模式学习笔记十四:适配器模式、桥接模式与外观模式

1.适配器模式与桥接模式的区别和联系 适配器模式和桥接模式都是间接引用对象,因此可以使系统更灵活,在实现上都涉及从自身以外的一个接口向被引用的对象发出请求。 两种模式的区别在于使用场...

长平狐
2013/06/17
128
0
Design Patterns In FE --- 工厂模式

示例代码地址: github.com/FatGe/Desig… 工厂模式 工厂,是构造方法的抽象,用来实现不同的分配方案。它所涉及三类模式,简单工厂模式、工厂方法模式、抽象工厂模式本质上都是为了实例化。...

Yzz
08/06
0
0
策略模式-javascript

一个基于策略模式的程序至少由两部分组成。 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给...

wee911
09/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Tensorflow 2.0安装

Tensorflow2.0安装环境: Ubuntu 16.04或更高(64位) Windows 7或者更高(64位,且支持python3) 安装Tensorflow 2.0 GPU版本的需要安装NVIDIA相关软件包: NVIDIA驱动 :版本必须410.x或更...

JosiahMg
30分钟前
4
0
TL138/1808/6748F-EasyEVM开发板硬件、CPU、FLASH、RAM

TL138/1808/6748F-EasyEVM是广州创龙基于SOM-TL138/SOM-TL1808/SOM-TL6748F核心板开发的一款开发板。由于SOM-TL138/SOM-TL1808/SOM-TL6748核心板管脚兼容,所以此三个核心板共用同一个底板。...

Tronlong创龙
38分钟前
4
0
百度嵌入式AI解决方案EdgeBoard之内存驱动设计介绍

1. 背景介绍 由于 FPGA 具备可编程和高性能计算的特点,基于FPGA硬件的AI计算加速,正广泛地应用到计算机视觉处理领域。其中极具代表性的部署方式之一就是使用FPGA和CPU组合构成异构计算系统...

AI君
44分钟前
6
0
开放应用模型(OAM):全球首个云原生应用标准定义与架构模型

Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长。但同时我们也关注到,Kubernetes 的核心 API 资源比如 Service、Deploymen...

Mr_zebra
47分钟前
4
0
《Linux操作系统-Exynos4412》编译和安装Busybox

开发环境:Exynos4412-iTOP-4412开发板 现在 Busybox 的配置已经完成了,接下来开始编译 Busybox,在 Ubuntu 的终端输入 “make”命令开始编译 Busybox,如下图。 下图为编译过程中的截图。 ...

书白
50分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部