PHP 및 Python과 비교하여 Javascript의 데코레이터 모드 사용법에 대한 자세한 설명

伊谢尔伦
풀어 주다: 2017-07-24 14:49:46
원래의
1595명이 탐색했습니다.

데코레이터 패턴이라고도 불리는 데코레이터 패턴은 클래스에 새로운 동작을 동적으로 추가하는 객체 지향 프로그래밍 분야의 디자인 패턴입니다. 기능 측면에서 수정 패턴은 서브클래싱보다 더 유연하므로 전체 클래스가 아닌 객체에 일부 기능을 추가할 수 있습니다.

예를 들어, 사용자들이 메시지를 통해 소통하는 기술 포럼이 있는데, 포럼은 처음에는 지인들로 가득 차 있기 때문에 메시지를 받는 페이지는 거의 다음과 같습니다. :


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

나중에 포럼이 유명해지면서 일부 사람들이 링크를 올렸고, 링크가 포함된 메시지를 필터링해야 했습니다. 포럼이 발전함에 따라 스팸 링크를 개발한 사람들 외에도 쓸모없는 스패머도 많았고, 공격 등 비정상 게시물도 다양해 포럼 게시물 관리를 위해 별도의 클래스를 추상화해 관리할 수 있으며, 필터링 규칙을 확장해야 할 경우 동적으로 확장할 수 있다.


//基类
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());//被禁止
로그인 후 복사

파이썬에는 추상 클래스와 메서드가 없으며 구현도 더 간단합니다.


#!/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()
로그인 후 복사

Javascript에는 엄격한 클래스가 없으며 모든 상속은 프로토타입을 기반으로 하며 이해하기 위한 약간의 노력:


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());
로그인 후 복사

Javascript에는 클래스의 특성이 없기 때문에 상속이 약간 맛이 없습니다. 위 코드는 Python에서 데코레이터를 추가하는 더 간단한 방법입니다. 방법, "@"을 통해 직접 함수에 데코레이터를 추가하여 다음과 같은 기능 확장 목적을 달성합니다.


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)
로그인 후 복사

데코레이션 모드의 목적은 기능의 동적 확장 문제를 해결하는 것입니다. 데코레이션 모드의 본질입니다. 객체를 유연하게 처리하는 것입니다. 데코레이션 모드를 이해하면 객체 지향 프로그래밍에 대한 심층적인 이해를 제공할 뿐만 아니라 프로그래밍 사고 능력도 향상시킬 수 있습니다.

위 내용은 PHP 및 Python과 비교하여 Javascript의 데코레이터 모드 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿