设计模式(二)策略模式

定义

Stragegy, 它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

要点

  • 策略模式是对 算法 的包装,是把使用算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以 互换

UML

strategy

优点

策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。

缺点

  • 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
  • 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。),比如以下的实例。

php代码示范

  • 策略模式基础PHP代码示范

举例说明

  • 商场收银系统,对一件商品有多种促销活动,那么这几种促销活动的算法最终的目的就是为了得到商品最终价钱,它们还可以相互替换。
  • 抽象策略角色 CashSuper,定义了一个公共接口,各种不同的算法以不同的方式实现这个接口。策略类通常由一个接口或者抽象类实现。
  • 具体策略角色CashNormal/CashRebate/CashReturn,实现接口抽象类CashasSuper,提供具体的算法实现。
  • 环境角色 CashContext 持有一个策略类的引用,最终给客户端调用
  • PHP代码例子。

你可能感兴趣的:(设计模式(二)策略模式)