デコレーター パターン (デコレーター パターンとも呼ばれる) は、クラスに新しい動作を動的に追加する、オブジェクト指向プログラミングの分野の設計パターンです。機能の点では、変更パターンはサブクラス化よりも柔軟であり、クラス全体ではなくオブジェクトに一部の機能を追加できます。
例えば、ユーザーがメッセージを通じてコミュニケーションする技術フォーラムがあります。フォーラムは最初は知り合いでいっぱいなので、メッセージの内容を確認する必要はほとんどありません。メッセージを受信するページは次のようになります。 :
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 サイトの他の関連記事を参照してください。