最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

Javascript的裝飾器模式與php、python對比用法詳解

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:15:16
文檔

Javascript的裝飾器模式與php、python對比用法詳解

Javascript的裝飾器模式與php、python對比用法詳解:修飾模式(Decorator Pattern),又叫裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動態(tài)地往一個類中添加新的行為的設(shè)計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。例如,有一個技術(shù)論壇,用戶通過留言進(jìn)行溝通
推薦度:
導(dǎo)讀Javascript的裝飾器模式與php、python對比用法詳解:修飾模式(Decorator Pattern),又叫裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動態(tài)地往一個類中添加新的行為的設(shè)計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。例如,有一個技術(shù)論壇,用戶通過留言進(jìn)行溝通

修飾模式(Decorator Pattern),又叫裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動態(tài)地往一個類中添加新的行為的設(shè)計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。

例如,有一個技術(shù)論壇,用戶通過留言進(jìn)行溝通,由于剛開始論壇里都是熟人,幾乎都不需要對留言的內(nèi)容作出審核,接收留言的頁面可以是這樣:

class SaveMsg(){
 private $msg;
 public function __construct($msg){
 $this->msg=$msg;
 }
 public function __store(){
 //存入數(shù)據(jù)庫
 }
}

后來,隨著論壇逐漸出名,就有一些人在上面發(fā)鏈接,就需要對含有鏈接的消息進(jìn)行過濾,論壇進(jìn)一步發(fā)展,發(fā)現(xiàn)除開發(fā)垃圾鏈接的外,還有很多無用的灌水,到后來可能還有攻擊等等各種不正常的帖子,所以對論壇帖子的管理,可以單獨抽象出一個類進(jìn)行管理,當(dāng)需要擴(kuò)充過濾規(guī)則時,可以進(jìn)行動態(tài)擴(kuò)充。

//基類
abstract class Filter{
 abstract public function isForbid();
}
//基礎(chǔ)過濾類
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];
 }
 }
}
//裝飾器,用來擴(kuò)充功能
abstract class FilterDecorator extends Filter{
 protected $obj;
 public function __construct(Filter $obj){
 $this->obj=$obj;
 }
}
//新過濾器,判斷是否重復(fù)發(fā)帖
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"){
 //判定是否重復(fù)發(fā)帖
 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中,不存在抽象類和方法,實現(xiàn)就更加簡單:

#!/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中,沒有嚴(yán)格的類,所有繼承都基于原型,理解起來會稍費功夫:

由于Javascript缺少類的特性,繼承對于它來說就顯得有點雞肋了,上面的代碼看起來更像是對兩個函數(shù)的處理, 在python中,有更加簡單的添加裝飾器的方法,直接通過”@”給函數(shù)自動添加裝飾器,達(dá)到擴(kuò)展功能的目的,如:

裝飾模式的目的是解決動態(tài)擴(kuò)展功能的難題,裝飾模式的本質(zhì)是對對象的靈活處理,理解裝飾模式,不僅能深入了解面向?qū)ο蟮某绦蛟O(shè)計,更能提高編程的思維能力。

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

文檔

Javascript的裝飾器模式與php、python對比用法詳解

Javascript的裝飾器模式與php、python對比用法詳解:修飾模式(Decorator Pattern),又叫裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動態(tài)地往一個類中添加新的行為的設(shè)計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。例如,有一個技術(shù)論壇,用戶通過留言進(jìn)行溝通
推薦度:
標(biāo)簽: 裝飾 模式 php
  • 熱門焦點
專題
Top
fffffffffffff

抖音扫码关注

手机端二维码

每天分享百科知识!