资讯专栏INFORMATION COLUMN

Chap5:行为型设计模式————策略模式

sshe / 2292人阅读

摘要:类共享,因此需要实现中的所有抽象方法,如果有的具体策略类比较简单,但还是必须要去实现它的抽象方法,因此会增加不必要的开销参考设计模式十八策略模式对象行为型深入面向对象模式与实践第版

因为最近在学策略模式,所以想先跳过创建型设计模式中得适配器模式

定义

策略模式,顾名思义,就是提供多个策略的模式,用户在不同的情况下可以选择不同的策略,比如商场的打折策略(不同节假日不同的折扣方式),旅游出行的方式(提供飞行,或者火车,或者大巴的方式)。再进一步讲,就是把这些同一个系列的不同的算法封装起来,让它们能够被客户自由地使用。

UML图

Drawn by StarUML

实例

大学课程(Lesson)中,有这样的两种课程,一种演讲(Lecture),一种研讨会(Seminar),两种都需要进行收费,并且有不同的收费机制(chargeType),前者是固定收费(FixedCost),后者则是按小时收费(TimeCost)

CostStrategy.php


TimeCostStrategy.php

getDuration() * 5);  
    public function chargeType(){
        return "Hourly rate";
    }

}
?>

FixedCostStrategy.php

lesson.php

duration = $duration;
        $this->strategy = $costStrategy;
    }
    public function cost(){
        return $this->strategy->cost($this);
    }
    public function chargeType(){
        return $this->strategy->chargeType();
    }
    public function getDuration(){
        return $this->duration;
    }

    //其它方法
}
?>

Lecture.php

Seminar.php

Client.php

chargeType().",and the cost is ".$Seminar->cost();
?>
优点

上下文(Context)和具体策略(ConcreteStrategy)是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类

策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例

消除冗余的if..else...语句

缺点

客户端需要知道每一个策略类,并且知道这些类有什么不同,因此要在策略行为与客户行为密切相关的时候才使用这种模式,把策略暴露给客户

策略模式会产生很多策略,因此开销问题也是需要考虑的问题

Context与Strategy之间不必要的通信开销。ConcreteStrategy类共享Strategy,因此需要实现Strategy中的所有抽象方法,如果有的具体策略类比较简单,但还是必须要去实现它的抽象方法,因此会增加不必要的开销

参考:
1.设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
2.深入PHP:面向对象、模式与实践(第3版)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21473.html

相关文章

  • 忘了再看设计模式-行为

    摘要:推文用设计模式解构三国是一种什么体验行为型设计模式一策略模式工厂模式优化结构状态模式随着状态改变而改变行为。推文状态机与状态模式责任链模式多个对象依次处理请求前者指定后者。代理模式代理针对一个对象,为了增加控制等中介双方都是多个,为了解耦。 策略模式 选择使用封装好的一系列算法,可相互替换。 类比:商店[Context]买完衣服买单[Stratege](现金[Concrete Stra...

    ShevaKuilin 评论0 收藏0
  • 设计模式行为

    摘要:设计模式分创建型模式,结构型模式和行为型模式。责任链模式使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。状态模式的核心是封装,通过状态的变更引起行为的变更。 前言 最近加班是真的很多,无法腾出大块时间来学习。设计模式又不想只更到一半半途而废,想了又想,决定精简,保证大家一看就懂(看完就忘...)。设计模式分创建型模式,结构型模式和行为型模式。到目前为止,创建型...

    hlcc 评论0 收藏0
  • J2EE下的常用设计模式

    摘要:当然,除了让我们显得更加专业之外,在自己所学习或者工作的项目中,适当合理的使用设计模式,能够给项目带来很大的好处。 简单说两句 本文首发公众号【一名打字员】 对不住各位老铁了,年前说好要更几波JAVA的东西,又偷懒了,没办法,在这里用小锤锤偷偷锤了自己几下。由于工作原因,更新时间不定,各位老铁有问题可以私聊我哈。 对于初学者或者是正在向中高级的Java程序猿(打字员)来说,时刻梳理自己...

    robin 评论0 收藏0
  • 设计模式策略模式

    摘要:在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。而本次示例使用策略模式来实现这种数学运算。 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。其实现原理是定义一系列的算法,将他们一个个封装起来,并且是他们可以互相替换,这样避免了使用 if … else 语句所带来的复杂度和维护...

    104828720 评论0 收藏0
  • 设计模式--简化解释(三)——行为模式

    摘要:创建型设计模式结构型设计模式行为型设计模式行为型设计模式简而言之行为型设计模式关心的是对象之间的责任分配。这种模式被认为是一种行为模式,因为它可以改变程序的运行行为。 1.创建型设计模式2.结构型设计模式3.行为型设计模式 行为型设计模式 简而言之 行为型设计模式关心的是对象之间的责任分配。它们与结构模式的不同之处在于,它们不仅指定了结构,而且还概述了它们之间消息传递/通信的模式。换句...

    cangck_X 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<