前言: 策略模式初学者很少听到,有时候遇到,但是却不清楚是使用该模式实现的功能,我看了一下百度,对这个模式的解释很生硬,其实简单的来说,什么是策略模式呢,比如你去淘宝上买东西,如果你是男生,它的首页会给你推荐男生喜欢的物品,如果你是女生呢,它会给你推荐女生常用的物品,就感觉啊,这个东西是有生命一样,他知道你是什么样的一类人 。还有就是,比如你在朋友圈经常看到官方推送的一些广告 ,如果你是白羊座,他上面就会显示白羊座用这个东西多好多好,如果你是其他星座,就会发现它显示的是其他星座了 。所以这时候用官方的语言概括来说,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于策略模式。这个时候是不是容易理解了很多
目录
一、策略模式的由浅入深
- 由上面可知,编程中的策略模式,就是会知道你是什么人,然后给你推荐你喜欢的东西,让营销最大化
- 这里必然涉及到,程序在运行的时候,给你这个人进行分门别类,然后执行了不同的方法导致的
- 这里我们定义两个类,拥有相同的方法,执行的内容却不同
- 策略模式需要做的就是当用户进来时候,同一个入口让他根据这个人的行为去执行其中某一个类中的方法
<?php
/**
* Class A
*/
class A {
public function name()
{
echo "我是A类";
}
}
/**
* Class B
*/
class B {
public function name()
{
echo "我是B类";
}
}
/**
* Class strategy
*/
class strategy
{
/**
* @var $obj
*/
private $obj;
/**
* @return mixed
*/
public function getName()
{
return $this->obj->name();
}
/**
* @param $class
*/
public function setClass($class)
{
$this->obj = $class;
}
}
$strategy = new strategy();
//分门别类
$strategy->setClass(new B());
//同一个入口
$strategy->getName();
- 结果
我是B类
二、策略模式的实际应用
- 在了解了策略模式的原理之后,在平时的应用场景是什么呢
- 我这里以情景: 一个用户去某酒店网站定住宿为例,页面上根据你的历史消费记录,会为你显示高等住宿和丰富的晚餐,或者仅仅显示大众住宿和廉价的自助餐
- 我们先定义接口去实现住房和晚餐的方法
- 然后定义两个群里的类去实现这个接口,分别是尊贵的人群和普通的人群
- 当有个autofelix用户去订房间,给他注入大众用户的类
<?php
/**
* Interface userStrategy
*/
interface userStrategy
{
public function hotel();
public function dinner();
}
/**
* 尊贵的客人享有的待遇
* Class rich
*/
class rich implements userStrategy
{
public function hotel()
{
return "你是高贵的客人,为你推荐了高级住宿";
}
public function dinner()
{
return "你是高贵的客人,为你推荐了烛光晚餐";
}
}
/**
* 普通的客人享有的待遇
* Class poor
*/
class poor implements userStrategy
{
public function hotel()
{
return "你是普通的客人,为你推荐了大众住宿";
}
public function dinner()
{
return "你是普通的客人,为你推荐了自助餐";
}
}
/**
* Class user
*/
class user
{
private $_userClass;
public function getHotel() {
return $this->_userClass->hotel();
}
public function getDinner() {
return $this->_userClass->dinner();
}
public function setUserClass(userStrategy $userStrategy) {
$this->_userClass = $userStrategy;
}
}
/**
* 这时候有个autofelix用户过来网站预定房间
* Class autofelix
*/
class autofelix extends user {}
$people = new autofelix();
//设置群体
$people->setUserClass(new poor());
//获取该群体的住宿和晚餐
$hotel = $people->getHotel();
$dinner = $people->getDinner();
echo json_encode([
'hotel' => $hotel,
'dinner' => $dinner
]);
- 结果
{
hotel: "你是普通的客人,为你推荐了大众住宿",
dinner: "你是普通的客人,为你推荐了自助餐"
}