PHP 设计模式 笔记与总结(8)策略模式

① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。

② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。

在 Common 目录下新建 UserStrategy.php,定义接口:

<?php
namespace Common;

//定义策略接口
interface UserStrategy{
    //显示广告
    function showAd();
    //展示类目
    function showCategory();
}

在 Common 目录下新建 FemaleUserStrategy.php ,女性用户的策略实现:

<?php
/*
 * 女性用户的策略实现
 */
namespace Common;
use Common\UserStrategy;

class FemaleUserStrategy implements UserStrategy{

    function showAd(){
        echo ‘2015春夏新款女装‘;
    }

    function showCategory(){
        echo ‘女装‘;
    }
} 

在 Common 目录下新建 MaleUserStrategy.php ,男性用户的策略实现:  

<?php
/*
 * 男性用户的策略实现
 */
namespace Common;
use Common\UserStrategy;

class MaleUserStrategy implements UserStrategy{

    function showAd(){
        echo ‘Apple Watch‘;
    }

    function showCategory(){
        echo ‘电子产品‘;
    }
} 

入口文件 index.php:

<?php
define(‘BASEDIR‘,__DIR__); //定义根目录常量
include BASEDIR.‘/Common/Loader.php‘;
spl_autoload_register(‘\\Common\\Loader::autoload‘);

class Page{

    protected $strategy;

    function index(){
        echo ‘AD:‘;
        $this->strategy->showAd();
        echo ‘<br>Category:‘;
        $this->strategy->showCategory();
    }

    //用于外部设置策略
    function setStrategy(\Common\UserStrategy $strategy){
        $this->strategy = $strategy;
    }
}

$page = new Page();
if(isset($_GET[‘female‘])){
    $strategy = new \Common\FemaleUserStrategy();
}else{
    $strategy = new \Common\MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();

访问 http://127.0.0.17/php/design/psr0/index.php?female

输出:

AD:2015春夏新款女装
Category:女装

访问 http://127.0.0.17/php/design/psr0/index.php

输出:

AD:Apple Watch
Category:电子产品

【策略模式的控制反转】

③ 使用策略模式可以实现 Ioc,依赖倒置、控制反转

在上例中 Page 类 依赖于 MaleUserStrategy 类和 FemaleUserStrategy 类。在 Page 类中不需要实现这两个类,在执行的过程中,才将这个关系进行绑定。

==

如果两个类是互相依赖的关系,那么它们之间就是一个紧耦合的设计,不利于替换其中某一个环节;而策略模式使用依赖倒置以后,就可以很方便地替换其中某一个类。

时间: 2024-10-28 04:31:40

PHP 设计模式 笔记与总结(8)策略模式的相关文章

设计模式总结篇系列:策略模式(Strategy)

前面的博文中分别介绍了Java设计模式中的创建型模式和结构型模式.从本文开始,将分别介绍设计模式中的第三大类,行为型模式.首先我们了解下分为此三大类的依据. 创建型模式:主要侧重于对象的创建过程: 结构型模式:主要侧重于处理类或对象的组合: 行为型模式:主要侧重于类或对象之间的交互以及职责分配. 首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化. 具体可以看一下下面的例子(以计算加.减.乘为例): 1. 对加.减.

设计模式 ( 十九 ):Strategy策略模式 -- 行为型

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择.这

设计模式之第8章-策略模式(Java实现)

设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲1000才送500,不如冲两次500,这样可以送600呢.”“这只能说明你不是很笨,但是也算不上聪明.”“啊?难道我想错了?”“这是一种策略,策略,懂?他如果是冲1000送700的话你是不是很大的可能性冲500?而不是1000,但是如果这样的话,在“聪明人”,对,没错,就是你这样的人来说,冲两次500表

设计模式(一)学习----策略模式

策略设计模式:定义一组算法,将每个算法都分装起来,并使他们之间可以互换. 策略模式就是使用的面向对象思想中的继承和多态的机制 策略模式的通用类图: Context类:Strategy类,并且和Strategy类是整体和个体的关系,即聚合关系.对策略角色个体进行封装. Strategy接口:定义这个策略或算法必须有的方法和属性. ConcreteStrategy1,ConcreteStrategy2具体策略角色实现类.实现抽象策略中的方法,该类中含有具体的算法. 上图变成Java代码: 抽象的策略

javascript设计模式与开发实践阅读笔记(5)——策略模式

策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数.这样做的好处是可以消化掉内部的分支判断,使代码效率更高. 使用策略模式计算奖金 现在要实现这样一个东西,年终奖是根据员工的工资基数和年底绩效情况来发放的.例如,绩效为S的人年终奖有4倍工资,绩效为A的人年终奖有3倍工资,而绩效为B的人年终奖是2倍工资.假设财务部要求我们提供一段代码,来方便他们计算员工的年终奖. 思路一:创建一个函数,接收两个参数,

设计模式学习笔记(四:策略模式)

1.1概述 方法是类中最重要的组成部分,一个方法的方法体由一系列语句构成,也就是说一个方法的方法体是一个算法.在某些设计中,一个类的设计人员经常可能涉及这样的问题:由于用户需求的变化,导致经常需要修改类中某个方法的方法体,即需要不断地变化算法.在这样的情况下可以考虑使用策略模式. 策略模式是处理算法不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法.策略模式把针对一个算法标识的一系列具体算法分别封装在不同的类中,使得各

《大话设计模式学习笔记》2:策略模式

商场促销示例: 1.策略类: public abstract class CashSuper { public abstract double AcceptCash(double money); } 2.具体策略类(以打折类为例): public class CashRebate:CashSuper { private double moneyRebate; public CashRebate(double moneyRebate) { this.moneyRebate = moneyRebat

【设计模式】Java设计模式第零课之策略模式

从今天开始看<<Head First 设计模式>>,打算每学习一章都写一篇笔记,今天的第零篇希望是一个好的开端,能够善始善终.加油. 设计模式入门:策略模式(看实际的需求(情景)是什么,采用适当的策略) 设计原则零:不管当初软件设计的多好,一段时间之后总是成长和改变的,否则软件就会死亡. 设计原则一:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起 把会变化的部分取出并封装起来,好让其他部分不会受到影响 这样代码引起的不经意后果变少,系统变得更有弹性

Head First Design Pattern 读书笔记(1) 策略模式

Head First Design Pattern 读书笔记(1) Strategy Pattern 策略模式 这几天为了锻炼看英语文档的能力,开着有道硬着头皮看 <Head First Desgin Pattern>的原版书,顺便做下笔记,把里面提到的每个模式通过回忆的方式画出来复习并记下来总结下学习成果=.= 关于设计模式 使用设计模式是为了增强程序的复用性,拓展性,易维护性. 设计模式会增加程序代码的复杂度,并不是所有情况都必须使用设计模式,需要根据需求以及经验评估使用场景. 学习并掌握

《JavaScript设计模式与开发实践》—— 策略模式

策略模式的定义是: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. (1) 使用策略模式计算奖金 经过思考,我们想到了更好的办法--使用策略模式来重构代码.策略模式指的是定义一系列的算法,把它们一个个封装起来.将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来. 一个基于策略模式的程序至少由两部分组成.第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程. 第二个部分是环境类 Context,