Maison  >  Article  >  interface Web  >  Explication détaillée de l'utilisation du mode décorateur de Javascript par rapport à php et python

Explication détaillée de l'utilisation du mode décorateur de Javascript par rapport à php et python

伊谢尔伦
伊谢尔伦original
2017-07-24 14:49:461596parcourir

Decorator Pattern, également appelé Decorator Pattern, est un modèle de conception dans le domaine de la programmation orientée objet qui ajoute dynamiquement de nouveaux comportements à une classe. En termes de fonctionnalités, le modèle de modification est plus flexible que le sous-classement, vous permettant d'ajouter des fonctionnalités à un objet plutôt qu'à la classe entière.

Par exemple, il existe un forum technique où les utilisateurs communiquent par messages. Puisque le forum est plein de connaissances au début, il n'est presque pas nécessaire de revoir le contenu des messages. la réception des messages peut ressembler à ceci :


class SaveMsg(){
 private $msg;
 public function __construct($msg){
 $this->msg=$msg;
 }
 public function __store(){
 //存入数据库
 }
}

Plus tard, à mesure que le forum devenait célèbre, certaines personnes y ont posté des liens, et il a fallu filtrer les messages contenant des liens. Le forum s'est développé et a constaté qu'en plus de ceux qui développent des liens de spam, il y a aussi beaucoup de spams inutiles, et plus tard, il peut y avoir des attaques et d'autres messages anormaux. Par conséquent, pour la gestion des messages du forum, une classe distincte peut être créée. abstrait pour la gestion Lorsque les règles de filtrage doivent être étendues, une expansion dynamique peut être effectuée.


//基类
abstract class Filter{
 abstract public function isForbid();
}
//基础过滤类
class MsgFilter extends Filter{
 public $content;
 public function __construct($msg){
 $this->content=$msg;
 }
 public function isForbid(){
 if(preg_match("/https?/i",$this->content)){
 return [true,"Not Allowed Urls"];
 }else{
 return [false];
 }
 }
}
//装饰器,用来扩充功能
abstract class FilterDecorator extends Filter{
 protected $obj;
 public function __construct(Filter $obj){
 $this->obj=$obj;
 }
}
//新过滤器,判断是否重复发帖
class repeat extends FilterDecorator{
 public function isForbid(){
 if($this->obj->isForbid()[0] === true){
 //判定是否包含url
 return $this->obj->isForbid();
 }else if($this->obj->content == "this is a test"){
 //判定是否重复发帖
 return [true,"Repeat Posts"];
 }else{
 return [false];
 }
 }
}
$test = new MsgFilter("httpsfdjoafdsajof");
print_r($test->isForbid());//被禁止
$test2 = new repeat(new MsgFilter("this is a test"));
print_r($test2->isForbid());//被禁止

En python, il n'y a pas de classes ni de méthodes abstraites, et l'implémentation est plus simple :


#!/usr/bin/env python
class Filter():
  pass
class MsgFilter(Filter):
  def __init__(self,msg):
    self.content=msg
  def isForbid(self):
    if('http' in self.content):
      return [True,"Not Allowed Urls"]
    else:
      return [False]
class FilterDecorator(Filter):
  def __init__(self,obj):
    self._obj=obj
class Repeat(FilterDecorator):
  def isForbid(self):
    if self._obj.isForbid()[0]:
      return self._obj.isForbid()
    elif self._obj.content == 'this is a test':
      return [True,"Repeat Posts"];
    else:
      return [False]
test = MsgFilter("this is a content have http urls")
print test.isForbid()
test2 = Repeat(MsgFilter('this is a test'))
print test2.isForbid()

En Javascript, il n'y a pas de classes strictes. Tout héritage est basé sur des prototypes. Il faut un petit effort pour comprendre :


function MsgFilter(msg){
 this.content=msg;
 this.isForbid=function(){
 if(this.content.match(/http/g)){
 return [true,"Not Allowed Urls"];
 }else {
 return [false];
 }
 }
}
function Repeat(obj){
 var _obj=obj;
 this.isForbid=function(){
 if(_obj.isForbid[0] === true){
 return _obj.isForbid();
 }else if(_obj.content=='this is a test'){
 return [true,"Repeat Posts"];
 }else{
 return [false];
 }
 }
}
var test = new MsgFilter("his is a content have http urls");
console.log(test.isForbid());
var test2 = new Repeat(new MsgFilter("this is a test"));
console.log(test2.isForbid());

Puisque Javascript n'a pas les caractéristiques. des classes, l'héritage ne convient pas. Cela semble un peu insipide. Le code ci-dessus ressemble plus au traitement de deux fonctions. En python, il existe un moyen plus simple d'ajouter des décorateurs, qui consiste à ajouter automatiquement des décorateurs aux fonctions directement via "@". ". Pour atteindre l'objectif d'étendre les fonctions, telles que :


def Decorator(F):
  def newF(age):
    print "You Are Calling",F.__name__
    F(age)
  return newF
@Decorator
#通过@给函数showAge添加装饰器Decorator
def showAge(age):
  print "hello , i am %d years old"%age
showAge(10)

Le but du mode décoration est de résoudre le problème de l'expansion dynamique des fonctions. L'essence de Le mode décoration est le traitement flexible des objets. Comprendre Le mode Décoration fournit non seulement une compréhension approfondie de la programmation orientée objet, mais améliore également les compétences de réflexion en programmation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn