Javascriptのデコレータモードの使い方をphpやpythonと比較して詳しく解説

伊谢尔伦
リリース: 2017-07-24 14:49:46
オリジナル
1600 人が閲覧しました

デコレーター パターン (デコレーター パターンとも呼ばれる) は、クラスに新しい動作を動的に追加する、オブジェクト指向プログラミングの分野の設計パターンです。機能の点では、変更パターンはサブクラス化よりも柔軟であり、クラス全体ではなくオブジェクトに一部の機能を追加できます。

例えば、ユーザーがメッセージを通じてコミュニケーションする技術フォーラムがあります。フォーラムは最初は知り合いでいっぱいなので、メッセージの内容を確認する必要はほとんどありません。メッセージを受信するページは次のようになります。 :


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());//被禁止
ログイン後にコピー

Python には抽象クラスやメソッドはなく、実装はより単純です。


#!/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)
ログイン後にコピー

デコレーションモードの目的は、関数の動的拡張の問題を解決することです。オブジェクトを柔軟に扱うことは、デコレーション モードを理解することによって、オブジェクト指向プログラミングを深く理解できるだけでなく、プログラミング的思考スキルも向上させることができます。

以上がJavascriptのデコレータモードの使い方をphpやpythonと比較して詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート