Decorator Pattern, auch Decorator Pattern genannt, ist ein Entwurfsmuster im Bereich der objektorientierten Programmierung, das einer Klasse dynamisch neue Verhaltensweisen hinzufügt. Hinsichtlich der Funktionalität ist das Änderungsmuster flexibler als die Unterklassenbildung, sodass Sie einem Objekt statt der gesamten Klasse einige Funktionen hinzufügen können.
Zum Beispiel gibt es ein technisches Forum, in dem Benutzer über Nachrichten kommunizieren. Da das Forum zu Beginn voller Bekannter ist, besteht fast keine Notwendigkeit, den Inhalt der Nachrichten zu überprüfen Das Empfangen von Nachrichten kann so aussehen:
class SaveMsg(){ private $msg; public function __construct($msg){ $this->msg=$msg; } public function __store(){ //存入数据库 } }
Später, als das Forum berühmt wurde, posteten einige Leute Links darauf und es war notwendig, Nachrichten mit Links zu filtern. Das Forum entwickelte sich weiter und stellte fest, dass es neben denen, die Spam-Links entwickeln, auch viele nutzlose Spam-Mails gibt und es später zu Angriffen und anderen abnormalen Beiträgen kommen kann. Daher kann eine separate Klasse für die Verwaltung von Forenbeiträgen erstellt werden Für die Verwaltung abstrahiert werden. Wenn die Filterregeln erweitert werden müssen, kann eine dynamische Erweiterung durchgeführt werden.
//基类 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());//被禁止
In Python gibt es keine abstrakten Klassen und Methoden und die Implementierung ist einfacher:
#!/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()
In Javascript gibt es keine strengen Klassen. Die gesamte Vererbung basiert auf Prototypen. Es erfordert ein wenig Aufwand, um Folgendes zu verstehen:
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());
Da Javascript die Eigenschaften fehlt Für viele Klassen ist die Vererbung nicht geeignet. Der obige Code ähnelt eher der Verarbeitung zweier Funktionen. In Python gibt es eine einfachere Möglichkeit, Dekoratoren direkt über „@“ zu Funktionen hinzuzufügen. ". Um den Zweck der Funktionserweiterung zu erreichen, wie zum Beispiel:
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)
Der Zweck des Dekorationsmodus besteht darin, das Problem der dynamischen Erweiterung von Funktionen zu lösen. Das Wesentliche von Der Dekorationsmodus ist die flexible Verarbeitung von Objekten. Der Dekorationsmodus bietet nicht nur ein tiefgreifendes Verständnis der objektorientierten Programmierung, sondern verbessert auch die Denkfähigkeiten in der Programmierung.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des Dekoratormodus von Javascript im Vergleich zu PHP und Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!