首页 > 其他分享 >策略者模式

策略者模式

时间:2022-11-07 17:45:33浏览次数:49  
标签:策略 角色 模式 算法 new php weaponBehavior 定义

策略者模式:

  定义了算法组,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用的算法客户!

 

案例解析:

   游戏中的不同的角色可以使用不同的武器来进行打仗!

   国王 => 宝剑

    士兵 => 刀

 

  定义角色接口(InterRole.php)

<?php


interface InterRole
{
    public function fight(); //打架

}

定义角色基类(BaseRole.php)

<?php

class BasiRole
{
    protected $weaponBehavior; //兵器行为
    //设置武器
    public function setWeapon(WeaponBehavior $behavior){
        $this->weaponBehavior = $behavior;
    }
}

 定义国王角色(KingRole.php)

<?php
class KingRole extends BasiRole implements InterRole
{
    public function __construct(){

    }

    public function fight()
    {
        //设置武器
        $this->setWeapon(new SwordBehavior());
        //打架
        $this->weaponBehavior->useWeapon();
    }
}

定义士兵角色(SoldierRole.php)

<?php


class SoldierRole extends BasiRole implements InterRole
{

    public function fight()
    {
        //设置武器
        $this->setWeapon(new KnifeBehavior());
        //打架
        $this->weaponBehavior->useWeapon();
    }
}

定义武器行为接口(WeaponBehavior.php)

<?php


interface WeaponBehavior
{
    //使用武器
    public function useWeapon();
}

定义刀的实现体(KnifeBehaviro.php)

<?php


class KnifeBehavior implements WeaponBehavior
{

    public function useWeapon()
    {
        echo 'I am  knife';
    }
}

定义宝剑的实现体(SwordBehavior.php)

<?php


class SwordBehavior extends BasiRole implements WeaponBehavior
{

    public function useWeapon()
    {
        echo 'I am sword';
    }
}

定义启动入口程序(index.php)

<?php
function __autoload($class){
    if ($class) {
        $file = str_replace('\\', '/', $class);
        $file .= '.php';
        if (file_exists($file)) {
            include $file;
        }
    }
}
//实例化国王
$role = new KingRole();
$role->fight();

//实例化士兵
$role2 = new SoldierRole();
$role2->fight();

目录文件展示

 

 

执行命令

 

 总结:

   通过接口定义(角色接口)找到需要差异化实现的特性,通过继承(BaseRole)找到通用的特性,通过封装算法(武器行为类),让算法和使用者解耦,更加独立!

  多用组合,少用继承!

 

标签:策略,角色,模式,算法,new,php,weaponBehavior,定义
From: https://www.cnblogs.com/chulx/p/16866814.html

相关文章

  • 创建型设计模式-原型模式(深拷贝,浅拷贝)
    Person类:publicclassPerson{publicstringName{get;set;}publicintAge{get;set;}publicAddressAddress{get;set;......
  • 创建型设计模式-单例模式(为什么要双重加锁判断)
    代码publicclassSingleObject{privatestaticSingleObjectinstance;privatestaticobjectlockobj=newobject();privateSingleObject(){}publicstatic......
  • 设计模式学习(二):单例模式
    设计模式学习(二):单例模式作者:Grey原文地址:博客园:设计模式学习(二):单例模式CSDN:设计模式学习(二):单例模式单例模式单例模式是创建型模式。单例的定义:“一个类只允许创建......
  • 〖JAVA养成计划〗设计模式-单例设计模式以及衍生的多例设计模式
     单例设计模式packagecom.tongbu;/***单例设计模式分为两类:*①是俄汉式*②是懒汉式*以下程序是俄汉式:不管程序中有没有使用,都实例化对象。*@authorAdministrat......
  • sshd开启调试模式
    今天使用私钥方式无法登录服务器,做了以下排查,都没解决问题:1.删除root目录下.ssh目录,重新解压自己秘钥2.查看.ssh目录及子文件权限3.替换正常的sshd_config文件只能尝试......
  • 门面模式
    复习引入一、几种设计模式(1)创建型:工厂模式(简单工厂、抽象工厂)、单例模式、原型模式、建造者模式。​ 随着软件内部分工原来月明确,对象的创建和对象的使用分开也就成为......
  • 23种设计模式之自定义Spring框架(五)
    7,自定义Spring框架7.1spring使用回顾自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。数据访问层。定义UserDao接口及其子......
  • 23种设计模式之设计模式介绍(一)
    1,设计模式概述1.1软件设计模式的产生背景"设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境......
  • 拓端tecdat|r语言代写多均线量化策略回测
    移动平均线是技术分析中最常用的,作为一种简单有效的数学模型而被广泛使用。均线使用的方式的差异在于均线的计算方式与价格使用方式。不同的均线计算方式会产生不同的结果,不......
  • 设计模式
    设计模式(一)——简单工厂设计模式(二)——工厂方法设计模式(三)——抽象工厂设计模式(四)——建造者模式设计模式(五)——原型模式设计模式(六)——单例模式......