首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Laravel之容器(实战)背景设计客户端代码总结参考

Laravel之容器(实战)背景设计客户端代码总结参考

作者头像
zhuanxu
发布2018-08-23 12:48:06
发布2018-08-23 12:48:06
5100
举报
文章被收录于专栏:进击的程序猿进击的程序猿

背景

需求描述

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

设计

简要的设计图

设计图

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

客户端代码

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

代码语言:javascript
复制
 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);
    }

再给出使用容器的方式:

代码语言:javascript
复制
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);
    }

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

总结

多态的活性与依赖注入

参考

依赖注入那些事儿

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.06.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 背景
  • 设计
  • 客户端代码
  • 总结
  • 参考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档