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

背景

需求描述

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

设计

简要的设计图

设计图

我们可以看到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);
    }

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

总结

多态的活性与依赖注入

参考

依赖注入那些事儿

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术翻译

Kubernetes扩展容器架构的7 个工具

Kubernetes是最初由Google开发的容器编排工具,已成为敏捷和DevOps团队的重要资源。作为一个开源工具,Kubernetes本身正在成为一个生态系...

1134
来自专栏UAI人工智能

实战派 | AI摸爬滚打之Win7+docker安装PaddlePaddle全纪实

1981
来自专栏逸鹏说道

KVM基于内核的虚拟机概念理解与客户机浅析

作为一个KVM的学习者,如果你想要自己完善一个KVM样品级的解决方案,仅仅学会图形化界面使用和简单的配置(详情见上一篇文章)是远远不够的。在上文中感谢@laow...

3874
来自专栏编程坑太多

跟我一起学docker(一)--认识

2094
来自专栏非著名程序员

Android NFC 技术解析,附 Demo 源码

近期由于项目需求,对 Android NFC 技术进行了一定的了解和深入,整合了一些网络、书籍资料,此文章仅作为自己的学习笔记。 NFC 是 Near Fiel...

3467
来自专栏deed博客

预装Windows8的品牌电脑重装系统以及装双系统的那点事儿

1593
来自专栏王二麻子IT技术交流园地

《跟我学IDEA》一、下载安装idea,设置背景字体编码,配置JDK

写在前面的话: 作为一个在IT界摸爬滚打6年+的老程序员,我属于会的东西多而杂,但是没有任何一样精通的。曾经自己也认真过,蹉跎过,最近和别的同事朋友聊天时,突然...

2348
来自专栏编程坑太多

『中级篇』Kubenetes简介(60)

PS:了解我的老铁都知道,概念讲的少,更多重在实践,通过实践更好的理解概念,从下次开始怼k8s的环境和集群。如果跟我一起学的老铁,应该可以感受的到,在学习doc...

1993
来自专栏IT大咖说

起底Kolla:OpenStack容器化项目的实践

摘要 本次分享主要是讲解OpenStack在Docker化项目上的一些实践、遇到的问题,还有后续会做的事以及遇到的挑战。 ? OpenStack交付工具 在Op...

45411
来自专栏FreeBuf

如何打造一款可靠的WAF(Web应用防火墙)

之前写了一篇《WAF防御能力评测及工具》,是站在安全运维人员选型WAF产品的角度来考虑的(优先从测试角度考虑是前职业病,毕竟当过3年游戏测试?!)。本篇文章从W...

3475

扫码关注云+社区