php设计模式(八)装饰器模式

码海织云使
• 阅读 434

装饰器模式

  1. 动态的添加修改类功能
  2. 一个类提供了一项功能,如果要在修改并添加额外的功能,传统方案需要写一个子类继承,并重新实现类方法
  3. 使用装饰器模式,仅需要在运行时增加一个装饰器对象
// 例如修改Canvas的draw方法


class Canvas {
    private $data;
    private $decorators; // 用于保存所有装饰器
    
    public function init($hei,$wid){
        for($i=0;$i<$hei;$i++){
            for($i=0;$i<$wid;$i++){
                $data[$i][$j] = "*";
            }
        }
        
        $this->data = $data;
    }
    
    
    public function rect($a1,$a2,$b1,$b2) {
        foreach($this->data as $k1->$line){
            if($k1<$a1 or $k1 > $a2) continue;
            foreach($line as $k2 => $item){
                if($k2<$b2 or $k2> $b2) contine;
                $this->data[$k1][$2] = ' ';
            }
        }
    }
    
    public function draw(){
        foreach ($this->data as 
        $line){
            foreach ($lien as $item) {
                echo  $item;
            }
            echo PHP_EOL:
        }
    }
    
    
    // 用于增加装饰器
    public function addDecorator(Decorator $decorator){
        $this->decorators[] = $decorator;
    }
    
    // 前置执行
    public function before(){
        foreach($this->decorators as $decorator) {
            $decorator->before();
        }
    }
    
    
    
    public function after(){
        $decorators = array_reserse($this->decorator);
        foreach($decorators as $decorator) {
            $decorator->before();
        }
    }
}


// 装饰器接口  在某个方法之前,之后加入额外操作
interface Decorator {
    public function beforDraw();
    public function afterDraw();
}


class ColorDecorator implements Decorator {
    private $color;
    
    public function __construct($color){
        $this->color = $color;
    }
    

    public function before(){
        echo 'before'.$this->color;
    }
    
    public function after(){
        echo 'after';
    }
}

$c = new Canvas();
$c->addDecorator(new ColorDecorator('red'));  // 增加不同的装饰器,进行不同的修改
$c->rect(1,6,2,12);
$c->draw();
点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础5——装饰器
13、装饰器其本质:在不需要做任何代码变动的前提下,增加额外的功能。装饰器返回的是一个函数对象。相当于把函数作为参数传递进去,然后对函数进行装饰其本质就是一个闭包作用:1.给原来的函数增加额外的功能2.把原来的函数作为参数传递进去13.1基本用法标准版的装饰器pythondefwrapper(func):func为原来的函数名defin
Irene181 Irene181
4年前
恶补了 Python 装饰器的六种写法,你随便问~
大家好,我是明哥。今天给大家分享一下关于装饰器的知识点,内容非常干,全程高能,认真吸收看完,一定会对装饰器有更深的理解。Hello,装饰器装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰
Wesley13 Wesley13
3年前
ES6 系列之我们来聊聊装饰器
_摘要:_ Decorator装饰器主要用于:1.装饰类2.装饰方法或属性装饰类\\\js@annotation(https://my.oschina.net/annotation)classMyClass{}functionannotation(target){target.annotatedt
Stella981 Stella981
3年前
Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一、类的装饰器类作为一个对象,也可以被装饰。例子defwrap(obj):print("装饰器")obj.x1obj.y3obj.z5returnobj​
Wesley13 Wesley13
3年前
JavaWeb实现文件上传与下载
1\.增强HttpServletResponse对象  1.实现一个增强的HttpServletResponse类,需要继承javax.servlet.http.HttpServletRequestWrapper类,通过重写自己需要增强的方法来实现(这种模式就叫做装饰者模式),使用该增强类在
Stella981 Stella981
3年前
Category 特性在 iOS 组件化中的应用与管控
背景iOSCategory功能简介Category是ObjectiveC2.0之后添加的语言特性。Category就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。在ObjectiveC(iOS的开发语言,下文用OC代替)中的具体体现为:实例(类)方法、属性和协
Wesley13 Wesley13
3年前
Java Design Patterns
java的设计模式大体上分为三大类:创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模
Stella981 Stella981
3年前
Python 装饰器(Decorator)
Python 装饰器(Decorator)装饰模式有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。下面就一步步看看Python中的装饰器。装饰器本身是一个Python函数,他可以让其他函数在不需要做任何代码变动
Stella981 Stella981
3年前
Python装饰器用法实例总结
一、装饰器是什么python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离
Wesley13 Wesley13
3年前
JavaWeb之动态代理解决request请求编码问题
动态代理解决编码问题1.设计模式出现原因:软件开发过程中,遇到相似问题,将问题的解决方法抽取模型(套路)常见设计模式:单例,工厂,适配器,装饰者,动态代理。2.装饰者模式简单介绍谷歌汽车开发场景1.Java定义了汽车开发约定interfaceICar{s
3A网络 3A网络
2年前
Golang 常见设计模式之装饰模式
Golang常见设计模式之装饰模式想必只要是熟悉Python的同学对装饰模式一定不会陌生,这类Python从语法上原生支持的装饰器,大大提高了装饰模式在Python中的应用。尽管Go语言中装饰模式没有Python中应用的那么广泛,但是它也有其独到的地方。接下来就一起看下装饰模式在Go语言中的应用。简单装饰器我们通过一个简单的例子来
码海织云使
码海织云使
Lv1
几度思归还把酒,拂云堆上祝明妃。
文章
5
粉丝
0
获赞
0