Home >Backend Development >PHP Tutorial >Comparison of decorator patterns in PHP, Python and Javascript, pythonjavascript_PHP tutorial
Decorator Pattern, also called Decorator Pattern, is a design pattern in the field of object-oriented programming that dynamically adds new behaviors to a class. In terms of functionality, the modification pattern is more flexible than subclassing, allowing you to add some functionality to an object rather than to the entire class. The decoration pattern is very suitable for flexibly extending the functionality of objects. The following is the UML diagram of the decoration pattern:
For example, there is a technical forum where users communicate through messages. Since the forum is full of acquaintances at the beginning, there is almost no need to review the content of the messages. The page for receiving messages can look like this:
class SaveMsg(){ private $msg; public function __construct($msg){ $this->msg=$msg; } public function __store(){ //存入数据库 } }
Later, as the forum became famous, some people posted links on it, and messages containing links needed to be filtered. As the forum developed further, it was discovered that in addition to those who developed spam links, there were also a lot of useless spammers. Later, there may be attacks and other abnormal posts, so for the management of forum posts, a separate class can be abstracted for management. When the filtering rules need to be expanded, they can be dynamically expanded.
//基类 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, there are no abstract classes and methods, and the implementation is simpler:
#!/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, there are no strict classes. All inheritance is based on prototypes, which takes a little effort to understand:
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());
Since Javascript lacks the characteristics of classes, inheritance is a bit useless for it. The above code looks more like the processing of two functions. In python, there is a simpler way to add decorators. Automatically add decorators to functions directly through "@" to extend functions, such as:
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)
The purpose of the decoration mode is to solve the problem of dynamic expansion of functions. The essence of the decoration mode is the flexible processing of objects. Understanding the decoration mode can not only have an in-depth understanding of object-oriented programming, but also improve programming thinking skills.