PHP设计模式—装饰器模式
2021-03-12 16:31
标签:执行 role eth private 定义 abs color crete div 装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活。 这里以一个游戏角色为例,角色本身自带基础攻击属性,也可以通过额外的武器装备增加属性值。这里的装备武器就是动态的给角色添加额外的职责。 2、武器Arms.php,对应ConcreteComponent 3、装饰抽象类RoleDecorator.php,对应Decorator 4、剑Sword.php,对应ConcreteDecorator 5、枪Gun.php,对应ConcreteDecorator 6、调用 7、结果: PHP设计模式—装饰器模式 标签:执行 role eth private 定义 abs color crete div 原文地址:https://www.cnblogs.com/woods1815/p/12826090.html定义:
结构:
代码实例:
1、角色Role.php,对应Component/**
* 角色,抽象类
* Class Role
*/
abstract class Role
{
/**
* @return mixed
*/
abstract public function getName();
/**
* @return mixed
*/
abstract public function getAggressivity();
}
/**
* 武器,继承抽象类
* Class Arms
*/
class Arms extends Role
{
/**
* 基础攻击力
* @var int
*/
private $aggressivity = 100;
/**
* @return string
*/
public function getName()
{
// TODO: Implement getName() method.
return ‘基础攻击值‘;
}
/**
* @return int
*/
public function getAggressivity()
{
// TODO: Implement getAggressivity() method.
return $this->aggressivity;
}
}
/**
* 装饰抽象类
* Class RoleDecorator
*/
abstract class RoleDecorator extends Role
{
/**
* @var Role
*/
protected $role;
/**
* RoleDecorator constructor.
* @param Role $role
*/
public function __construct(Role $role)
{
$this->role = $role;
}
}
/**
* 剑,具体装饰对象,继承装饰抽象类
* Class Sword
*/
class Sword extends RoleDecorator
{
/**
* @return mixed|string
*/
public function getName()
{
// TODO: Implement getName() method.
return $this->role->getName() . ‘+斩妖剑‘;
}
/**
* @return int|mixed
*/
public function getAggressivity()
{
// TODO: Implement getAggressivity() method.
return $this->role->getAggressivity() + 200;
}
}
/**
* 枪,具体装饰对象,继承装饰抽象类
* Class Gun
*/
class Gun extends RoleDecorator
{
/**
* @return mixed|string
*/
public function getName()
{
// TODO: Implement getName() method.
return $this->role->getName() . ‘+震天戟‘;
}
/**
* @return int|mixed
*/
public function getAggressivity()
{
// TODO: Implement getAggressivity() method.
return $this->role->getAggressivity() + 150;
}
}
// 基础攻击值
$arms = new Arms();
echo $arms->getName();
echo $arms->getAggressivity() . ‘
‘;
// 基础攻击值+斩妖剑
$sword = new Sword(new Arms());
echo $sword->getName();
echo $sword->getAggressivity() . ‘
‘;
// 基础攻击值+震天戟
$gun = new Gun(new Arms());
echo $gun->getName();
echo $gun->getAggressivity() . ‘
‘;
// 基础攻击值+斩妖剑+震天戟
$person = new Gun(new Sword(new Arms()));
echo $person->getName();
echo $person->getAggressivity() . ‘
‘;基础攻击值100
基础攻击值+斩妖剑300
基础攻击值+震天戟250
基础攻击值+斩妖剑+震天戟450
总结:
下一篇:HTML的各种基本标签