Laravel之容器(实战)

作者: 小聪明李良才 | 来源:发表于2016-06-28 16:10 被阅读181次

背景

需求描述

接到上面一个需求,要设计一个英雄打怪,怎么做呢?

设计

简要的设计图

设计图

我们可以看到Role通过依赖注入武器,这样子,我们就可以随时替换攻击策略了。

客户端代码

在客户端使用,我们先给出没有使用容器的方式:

 public function test_use_sword()
    {
        //生成怪物
        $monster1 = new Monster( "小怪A", 50 );
        $monster2 = new Monster( "小怪B", 50 );
        $monster3 = new Monster( "关主", 200 );
        $monster4 = new Monster( "最终Boss", 1000 );

        //生成角色
        $role = new Role("超级英雄");

        //木剑攻击
        $role->setWeapon(new WoodSword());
        $role->attack($monster1);
        //铁剑攻击
        $role->setWeapon(new IronSword());
        $role->attack($monster2);
        $role->attack($monster3);

        //魔剑攻击
        $role->setWeapon(new MagicSword());
        $role->attack($monster3);
        $role->attack($monster4);
        $role->attack($monster4);
        $role->attack($monster4);
    }

再给出使用容器的方式:

public function test_user_container()
    {
        $container = new Container();
        $container->bind('GameDemo\IAttackStrategy','GameDemo\WoodSword');

        //生成怪物
        $monster1 = new Monster( "小怪A", 50 );
        $monster2 = new Monster( "小怪B", 50 );
        $monster3 = new Monster( "关主", 200 );
        $monster4 = new Monster( "最终Boss", 1000 );

        //生成角色
        /**
         * @var Role
         */
        $role = $container->make('GameDemo\Role',['英雄']);
        $container->rebinding('GameDemo\IAttackStrategy',function($c, $weapon) use($role){
            $role->setWeapon($weapon);
        });
        //木剑攻击
        $role->attack($monster1);
        //铁剑攻击
        $container->bind('GameDemo\IAttackStrategy','GameDemo\IronSword');
        $role->attack($monster2);
        $role->attack($monster3);

        //魔剑攻击
        $container->bind('GameDemo\IAttackStrategy','GameDemo\MagicSword');
        $role->attack($monster3);
        $role->attack($monster4);
        $role->attack($monster4);
        $role->attack($monster4);
    }

对比后,可以发现,使用容器后,客户端不用自己去实例化武器了,全都交给容器去做,极大的简化了客户端。

总结

多态的活性与依赖注入

参考

依赖注入那些事儿

相关文章

网友评论

    本文标题:Laravel之容器(实战)

    本文链接:https://www.haomeiwen.com/subject/cqutjttx.html