Comparison of decorator patterns in PHP, Python and Javascript, pythonjavascript_PHP tutorial

WBOY
Release: 2016-07-13 10:07:55
Original
686 people have browsed it

Comparison of decorator patterns in PHP, Python and Javascript, pythonjavascript

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(){
 //存入数据库
 }
}

Copy after login

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());//被禁止

Copy after login


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()

Copy after login

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());

Copy after login

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)
Copy after login

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.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/953154.htmlTechArticleComparison of the decorator patterns of PHP, Python and Javascript, pythonjavascript Decorator Pattern, also called the decorator pattern , is a dynamic method in the field of object-oriented programming...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!