设计模式之策略模式

电商类的项目,经常会有各种优惠活动,比如:满XX减X ;全场X折等等。

比较直接的做法是在代码里面各种if else 或者 switch case等。每次新增或者修改优惠策略,都可能会影响到其他的代码,耦合比较严重。

现在我用策略模式来实现这样的需求,看看带来的变化。

下面是代码:

<?php

//抽象策略类
abstract class PreferentialStrategy
{
    abstract public function calculate();
}


//具体策略
class FirstStrategy extends PreferentialStrategy
{
    public function calculate()
    {
        echo '满100减10的算法';
    }
}

class SecondStrategy extends PreferentialStrategy
{
    public function calculate()
    {
        echo '全场9折的算法';
    }
}

//环境类
class Context
{
    private $_strategy;

    public function __construct(PreferentialStrategy $_strategy)
    {
        $this->_strategy = $_strategy;
    }

    public function handle()
    {
        $this->_strategy->calculate();
    }

}

$context = new Context(new FirstStrategy());
$context->handle();

策略模式是一种行为设计模式,总统的思想也比较简洁,并不难以理解。

在上面的代码中还存在一个问题:客户端要明确的知道每个策略类的名称才能使用,这个是不太合理的,因此在实际使用中,我们往往还会和简单工厂结合,使客户端调用起来更加方便。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,908评论 3 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,127评论 19 139
  • qcow2镜像不同于raw镜像只需要一条简单的命令就可任意减小镜像大小,用的时间长了,会发现qcow2镜像已经达到...
    剑胆琴心python阅读 7,944评论 0 3
  • 在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自...
    nenhall阅读 212评论 0 0
  • 这段时间,我一直抱着头在想,我为什么会失败,我走到现在,做了很多亏本的生意,处了一些扯球蛋的人,也处了...
    青青莲阅读 148评论 0 0