牛逼plus!原来策略模式竟然是这样用的

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛逼plus!原来策略模式竟然是这样用的相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

策略模式初学者很少听到,有时候遇到,但是却不清楚是使用该模式实现的功能,我看了一下百度,对这个模式的解释很生硬,其实简单的来说,什么是策略模式呢,比如你去淘宝上买东西,如果你是男生,它的首页会给你推荐男生喜欢的物品,如果你是女生呢,它会给你推荐女生常用的物品,就感觉啊,这个东西是有生命一样,他知道你是什么样的一类人 。所以这时候用官方的语言概括来说,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于策略模式。这个时候是不是容易理解了很多

目录

一、策略模式的由浅入深 

 二、策略模式的实际应用


一、策略模式的由浅入深 

  • 由上面可知,编程中的策略模式,就是会知道你是什么人,然后给你推荐你喜欢的东西,让营销最大化
  • 这里必然涉及到,程序在运行的时候,给你这个人进行分门别类,然后执行了不同的方法导致的
  • 这里我们定义两个类,拥有相同的方法,执行的内容却不同
  • 策略模式需要做的就是当用户进来时候,同一个入口让他根据这个人的行为去执行其中某一个类中的方法
<?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: "你是普通的客人,为你推荐了自助餐"
}

 猜你喜欢:

牛逼plus!原来观察者模式竟然是这样用的

牛逼plus!原来策略模式竟然是这样用的

牛逼plus!原来适配器模式竟然是这样用的

牛逼plus!原来工厂模式竟然是这样用的

牛逼plus!原来单例模式竟然是这样用的

以上是关于牛逼plus!原来策略模式竟然是这样用的的主要内容,如果未能解决你的问题,请参考以下文章

牛逼plus!原来观察者模式竟然是这样用的

牛逼plus!原来工厂模式竟然是这样用的

牛逼plus!原来单例模式竟然是这样用的

小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了

爬虫技术原来可以做这么多牛逼哄哄的事情!

面向对象编程思想--单例模式