php与设计模式-七大原则

源码分析之七大设计原则 源码分析之七大设计原则 1…1 掌握设计模式的度? 掌握设计模式的四个层次: 1.没学之前是一点不懂,根本想不到用设计模式,写出的代码很糟糕; 2.学了几个模式之后,于是总想着要用自己学过的模式,于是时常造成误用模式而自己却不知道; 3.学完全部的模式之后,感觉模式之间都很相似,分不清差异,有困惑,但深知误用设计模式的害处,应用之时很犹豫。 4.灵活应用模式,甚至不应用具体的某种模式也能设计出非常优秀的代码,以达到无剑胜有剑的境界。 1.2 关于设计模式的一些理解 1.设计模式,不是一种新的语言,也不是什么 阅读详情

设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

七大原则

单一职责:

一个接口或类应该只有一种职能
一个类只完成它应该完成的职责

Demo:

class Phone{
    //拨号
         public function dial(){
                   return "dialing....";
         }
//挂断
         public function hangup(){
                   return "hangup!!!";
         }
//发送短信
         public function send(){
                   return "send info!!!";
         }
//接收短信
         public function receive(){
                   return "received!!!";
         }
}
//若修改接收方式的话则所有依赖Phone类的都需要修改
 
//改进后:按职责拆分为两个接口
interface IConnection{
         public function dial();
         public function hangup();
}
 
interface ICommunication{
         public function send();
         public function receive();
}
 
class Phone implements IConnection, {
         public function dial(){
                   return "dialing....";
         }
         public function hangup(){
                   return "hangup!!!";
         }
}
 
 
class Communication implements ICommunication{
         public function send(){
                   return "send!!!";
         }
         public function receive(){
                   return "received!!!";
         }
}

好处:
降低类的复杂性,实现什么样的职责都有清晰的定义
提高可读性
提高可维护性
降低变更引起的风险,对系统扩展性和维护性很有帮助

开闭原则:

开放扩展,关闭修改

为什么这么做?
在开发阶段,我们都知道,如果对一个功能进行扩展,如果只是一味地对方法进行修改,可能会造成一些问题,诸如 可 能会引入新的bug,或者增加代码的复杂度,对代码结构造成破坏、冗余,还需要重新进行全面的测试。那么该怎么解决这些问题?很简单,这就需要系统能够支持扩展,只有扩展性良好的系统,才能在不进行修改已有实现代码的基础上,引进新的功能。
我们应该怎么做?
要做到开闭原则,就需要多使用抽象类或者接口,将相似的类进行抽象,将公有的功能引入到抽象类中,这样在进行扩展时,只需要依据抽象类,生成新的子类即可。

好处:
可复用性好
可维护性好

依赖注入原则:

要依赖于抽象,不要依赖于具体的实现(Spring)面向接口编程
为什么这么做?
减少类间的耦合性,提高代码的可读性和可维护性。
我们应该怎么做?
1、每个类尽量都有接口和抽象类,或者抽象类和接口都有。
2、变量的表面类型尽量是接口或者是抽象类。
3、任何类都不应该从具体类派生。(但是在做二次开发的时候,我们无法获得高层代码的时候例外),规则不是绝对的。
4、尽量不要覆写基类已经实现好的方法。

Demo:

比如有这么条需求,用户注册完成后要发送一封邮件,然后你有如下代码:
 
先有邮件类'Email.class.php'
 
class Mail{
    public function send()
    {
        /*这里是如何发送邮件的代码*/
    }
}
 
然后又注册的类'Register.class.php'
 
class Register{
    private $_emailObj;
 
    public function doRegister()
    {
        /*这里是如何注册*/
 
        $this->_emailObj = new Mail();
        $this->_emailObj->send();//发送邮件
    }
}
 
然后开始注册
 
include 'Mail.class.php';
include 'Register.class.php';
$reg = new Register();
$reg->doRegister();

看起来事情很简单,你很快把这个功能上线了,看起来相安无事… xxx天过后,产品人员说发送邮件的不好,要使用发送短信的,然后你说这简单我把’Mail’类改下…
又过了几天,产品人员说发送短信费用太高,还是改用邮件的好… 此时心中一万个草泥马奔腾而过…
这种事情,常常在产品狗身上发生,无可奈何花落去…
以上场景的问题在于,你每次不得不对’Mail’类进行修改,代码复用性很低,高层过度依赖于底层。那么我们就考虑’依赖倒置原则’,让底层继承高层制定的接口,高层依赖于接口。

interface Mail
{
    public function send();
}
 
class Email implements Mail()
{
    public function send()
    {
        //发送Email
    }
}
 
class SmsMail implements Mail()
{
    public function send()
    {
        //发送短信
    }
}
 
class Register
{
    private $_mailObj;
 
    public function __construct(Mail $mailObj)
    {
        $this->_mailObj = $mailObj;
    }
 
    public function doRegister()
    {
        /*这里是如何注册*/
        $this->_mailObj->send();//发送信息
    }
}
 
下面开始发送信息
 
/* 此处省略若干行 */
$reg = new Register();
$emailObj = new Email();
$smsObj = new SmsMail();
 
$reg->doRegister($emailObj);//使用email发送
$reg->doRegister($smsObj);//使用短信发送
/* 你甚至可以发完邮件再发短信 */

上面的代码解决了’Register’对信息发送类的依赖,使用构造函数注入的方法,使得它只依赖于发送短信的接口,只要实现其接口中的’send’方法,不管你怎么发送都可以。上例就使用了" 注入 “这个思想,就像注射器一样将一个类的实例注入到另一个类的实例中去,需要用什么就注入什么。当然” 依赖倒置原则 “也始终贯彻在里面。” 注入 "不仅可以通过构造函数注入,也可以通过属性注入,上面你可以可以通过一个"setter"来动态为"mailObj"这个属性赋值。

好处:
减少类间的耦合性
提高系统的稳定
降低并行开发引起的风险
提高代码的可读性和可维护性。

里式替换原则:

里氏替换原则是对类继承的一种约束。对里氏替换原则有两种理解:
不能随便去继承不合适的,有多余方法或者属性的类。(例子1)
子类可以扩展父类的功能,但不能改变父类原有的功能。(例子2)

为什么这么做?
采用里氏替代原则可以增强程序的健壮性,版本升级的时候可以保持非常好的兼容性,即使增加子类,原有的子类也可以继续运行。
我们应该怎么做?
在引用基类的地方就能引用子类实现

//例子1
class Bird{
    protect function fly(){
    }
}
//翠鸟
class KingFisher extends Bird{
}
 
//鸵鸟
class Ostrich extends Bird{
    //鸵鸟不会飞啊
}
 
 
//例子2
class A{
    protected function add($a, $b){
        return $a + $b;
    }
}
//重载
class B extends A{
    protected function add($a, $b){
        return $a + $b + 100;
    }
}
看了第二个例子,有人会说那岂不是和重载矛盾了。初看是有点,但仔细理解,并不矛盾,我们可以这样处理矛盾:
//例子2
class A{
    protect function add($a, $b){
        return $a + $b;
    }
}
//重载
class B extends A{
    protected function add($a, $b, $c){
        return isset($c) ? $a + $b + 100 : $a + $b;
    }
}

里氏替换原则包含一下几个隐藏含义:
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

好处:
提高代码的重用性,子类拥有父类的方法和属性;
提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性;

迪米特原则:

一个对象应该对其他对象了解最少。
具体体现:
1、在类的划分上,应该创建有弱耦合的类;
2、在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
3、在类的设计上,只要有可能,一个类应当设计成不变类;
4、在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
5、尽量降低类的访问权限;
6、谨慎使用序列化功能(类或接口在客户端变更,却未在服务端同步更新,引发序列化失败,,项目管理易疏忽);
7、不要暴露类成员,而应该提供相应的访问器(属性)。

为什么这么做?
降低类之间的耦合。

我们应该怎么做?
在应用中最直接的实现就是在两个类中间建一个中介类。但是这样可能会造成中介类的澎爆。

迪米特法则主要运用在观察者模式和中介者模式中

Demo:
class Teacher {
         //老师对学生发布命令,清一下女生
         public function commond(GroupLeader $groupLeader){
                   //初始化女生
                   for($i=0; $i<20; $i++){
                            $listGirls[] = new Girl();
                   }
                   //告诉体育委员开始执行清查任务
                   $groupLeader -> countGirls($listGirls);
         }
}
class GroupLeader {
         //有清查女生的工作
         public function countGirls($listGirls = array()){
                   echo '女生的数量是:' . sizeof($listGirls);
         }
}
class Girl {
 
}
class Client {
         public static function doing() {
                   $teacher= new Teacher();
                   //老师发布命令
                   $teacher -> commond(new GroupLeader());
         }
}
Client :: doing();
 
//改进后
class Teacher {
 
         public function commond(GroupLeader $groupLeader){
                   //告诉体育委员开始执行清查任务
                   $groupLeader -> countGirls();
         }
}
 
class GroupLeader {
         private $_listGirls = array();
         //传递全班的女生
         public function __construct($listGirls){
                   $this -> _listGirls = $listGirls;
         }
         //有清查女生的工作
         public function countGirls(){
                   echo "女生数量是:" . sizeof($this -> _listGirls);
         }       
}
 
class Girl {
 
}
 
class Client {
         public static function doing() {
                   //初始化女生
                   for($i=0; $i<20; $i++){
                            $listGirls[] = new Girl();
                   }
                   $teacher= new Teacher();
                   //老师发布命令
                   $teacher -> commond(new GroupLeader($listGirls));
         }
}
Client :: doing();

接口隔离原则:

一个接口或者类应该拥有尽可能少的行为(那么,什么叫尽可能少?就是少到恰好能完成它自身的职责)
不要迫使实现接口的类去实现和该类无关的方法。

为什么这么做?
避免让接口的实现类实现一些不必要的功能
我们应该怎么做?
建立单一的接口,不要建立臃肿的庞大的接口,也就是说接口的方法尽量少。

Demo:

interface IBird{
    public function walk();
    public function chirp();
    public function fly();
}
 
class Ostrich implements IBird{
    //鸵鸟实现,出问题了,不会飞
}

接口隔离原则看起来确实很简单,但要注意在拆分接口的时候的粒度,不能太细,例如这个例子不能把每个动作都写个接口吧

优先使用组合而不是继承原则:

组合Demo:

class person{
  public $name;
  public $gender;
  public function say(){
    echo $this->name," \tis ",$this->gender,"\r\n";
  }
}
class family{
  public $people;
  public $location;
  public function construct($p,$loc){
    $this->people=$p;
 
    $this->location=$loc;
  }
}
$student=new person();
$student->name='Tom';
$student->gender='male';
$student->say();
$tom=new family($student,'peking');

以上代码中,定义了两个类,一个是person,一个是family;在family类中创建person类中的对象,把这个对象视为family类的一个属性,并调用它的方法处理问题,这种复用方式就叫“组合”。

请关注我的订阅号

订阅号.png

PHP编码规范(中文版) PHP团队开发编码规范,代码规范 立即下载

相关推荐

整合WGCNA、机器学习和孟德尔随机化

(G)通过蛋白质免疫印迹法(Western blot)测定的 UT-B(由 SLC14A1 编码)、ARHGEF38、NEFH、MSMB、KRT23 和 KRT15 在前列腺癌肿瘤组织和癌旁非癌组织中的蛋白质表达水平。本研究利用来自基因表达综合数据库(GEO)的数据集筛选差异表达基因(DEGs),并采用加权基因共表达网络分析(WGCNA),以识别在模块中与前列腺癌高度相关的驱动基因。(F)蓝绿色模块中的模块成员关系(MM)与前列腺癌(PCa)的基因显著性(GS)的散点图。(D)6 个基因之间的相关性分析。

多组・学・多组学 1136

【程序设计】PHP面向对象七大设计原则与总结

软件开发为什么需要面向对象设计? 软件开发设计就难的是应对变化、变化、变化。通过把系统功能封装成一个个对象,就可以粒度细化、功能实现的耦合度低和职责独立,细化了就能够更好的把控;耦合度低就是高内聚、松耦合,能够减少功能实现之间的关联,降低修改的影响;职责单一独立就能够提高代码复用,复用就能够提高开发效率与提高可维护性。 为了能够更好的实现面向对象设计,应该做到隔离变化,也就是把变与不变隔离开,...

编程哲学家的专栏 681

SEED-VIG数据集实战:5步搞定驾驶员疲劳检测模型(附Python代码)

本文提供了一份基于SEED-VIG数据集的驾驶员疲劳检测模型实战指南。通过五个核心步骤——数据准备、特征提取、模型训练、优化评估及部署思路,详细讲解了如何利用脑电信号构建分类器,并附有完整的Python代码,帮助开发者快速上手这一智能座舱关键技术。

w1x2y3的博客 263

php -代码规范

PHP-代码规范

码农挚友的博客 770

时序定江山,功耗写风骨——解读时序库lib文件的奥义【芯片设计 lib文件】

lib库,全称liberty library format file:它是Liberty时序文件的简称,使用 Liberty 语法来编写。它可以通过library compiler/dc转换成.db文件(database),供synopsis家的DC和PT使用,也可以通过spyglass的library compiler来生成sglib文件,供spyglass使用。他们是等价的,但db文件是二进制格式,人类不可读。

LogicYarn的博客 2601

招行收款通SM2加密解密全流程解析:PHP开发者必看

本文详细解析了招商银行收款通服务中SM2加密解密的完整流程,特别针对PHP开发者提供了从密钥管理到签名验签的实战指南。涵盖国密算法基础、PHP环境配置、密钥安全存储及生产环境优化方案,帮助开发者快速实现高安全性的支付系统集成。

weixin_30632089的博客 651

PHP四种设计模式

记录php初学设计模式

shangguanjialin的博客 1223

从数据到行动:客服运营必分析的8大核心维度

服务运营正从被动响应升级为数据驱动型战略体系。客服中心的海量交互数据能精准反映服务效能、客户体验及运营短板,关键在于实现数据的可视化与可操作化。本文系统剖析了八类核心数据指标:1)客户行为数据(CSAT/NPS/投诉内容);2)通话效率指标(AHT/接通率);3)服务质量(质检体系/情绪识别);4)坐席绩效(FCR/客户评价);5)流程与知识库(转接率/工单时效);6)渠道流量分析;7)异常预警机制;8)成本收益模型。通过构建多维数据分析体系,企业可在客户全生命周期管理中实现服务升级、风险防控与资源

2202_75469062的博客 1400

php设计模式六大原则,设计模式六大原则是什么

设计模式六大原则:1、单一原则;2、里氏替换原则;3、依赖倒置原则;4、接口隔离原则;5、迪米特原则;6、开闭原则。本文操作环境:Windows7系统,Dell G3电脑。设计模式六大原则:1、单一原则(Single Responsibility Principle):一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;a、业务对象(BO business object)、业务...

weixin_36429993的博客 655

AutoSAR系列讲解(入门篇)2.4-Runnables可运行实体

讲解一下Runnable和其工程的实际映射

雪云飞星的博客 3万+

RT-DETR改进策略【Conv和Transformer】| HiLo注意力机制 通过分离处理图像的高频和低频信息,高效处理图像特征

本文记录的是利用改进检测模型,针对目标检测中面临的多尺度特征融合效率与长距离依赖建模难题,HiLo注意力模块的引入旨在通过频率解耦策略优化高分辨率特征处理,将高频细节(如目标边缘)与低频语义(如场景结构)分离建模,提升目标检测精度。Fast Vision Transformers with HiLo AttentionHiLo注意力模块的提出源于对传统自注意力机制局限性的反思。传统多头自注意力(MSA)在处理高分辨率图像时存在以下问题:HiLo将注意力模块分为高频(Hi-Fi)和低频(Lo-Fi)两个分支,

Limiiiing的博客 814

PHP 中最全的设计模式(23种)

PhpDesignPatterns 【PHP 中的设计模式】一、 Introduction【介绍】 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题。设计模式并不一定就是一个类库或者第三方框架,它们更多的表现为一种思想并且广泛地应用在系统中。它们也表现为一种模式或者模板,可以在多个不同的场景下用于解决问题。设计模式可以用于加速开发,并且将很多大的想法或者设计以一种简单地方

ITYangs的博客 7436

逆向工具:一文讲述 Ghidra 的详细使用

Ghidra是由NSA开源的一款功能强大的逆向工程框架,支持多平台、多架构和多种文件格式分析。本文详细介绍了Ghidra的核心优势、安装配置方法、主界面功能模块,并通过一个CrackMe示例演示了完整的逆向分析流程。文章还讲解了高级功能如交叉引用、控制流图分析、数据类型重建和脚本自动化等,最后提供了常见文件格式的分析技巧。作为IDA Pro的免费替代方案,Ghidra适合个人学习、教学和中小项目使用。(149字)

数据知道的博客 4337

设计模式php+java版本(1) 基础篇 七大原则

2019年9月6日11:15:46 关于设计模式,其实就是编程思想的一个体现,有比较完善的编程思想写出的项目代码和没有编程思想的写出的差距巨大,代码的可读性,可维护性,可扩展性天差地别,有些刚接触的编程思想的人无法体会,等 你开始设计项目和某些关键性模块的时候,就完全可以理解了,其实我犯了一个错误,我现在项目,某些核心功能,因为自己没有完全参与导致写的部分核心代码问题很大,最后还得自己填,代码逻...

Z.X的博客 104

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式的学习了解(六大原则,五大创建型模式,十一大行为型模式,七大结构型模式)

主要是大脑中有个印象,过程中能想到就往上靠,想不到就想不到了。(摆手表情) 更新2019-05-28,看到对设计模式进行详细分析的文章设计模式看了又忘,忘了又看? 常见的模式 工厂模式:减少new 操作。 单例模式:避免大量new操作,创建一个实例,必须给其他对象提供这一实例,必须自行创建这个实例。 注册模式:全局共享,交换对象。 策略模式:面向对象多形式。 适配器模式:将各种截...

阿……莫西林杀菌室 294

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

再读设计模式七原则

GOF《设计模式》一书中提出了七条设计原则,七原则是一种理想状态的表达,但实际项目开发中可能会不得不打破这些原则的限制。 1. 单一职责原则(Single Responsibility Principle, SRP): There should never be more than one reason for a class to change. 言下之意做到类只承担单一职责(最细粒度)也就能...

weixin_30721077的博客 90

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式的七大原则

设计模式的七大原则:单一职责原则、接口隔离原则、依赖倒置原则、迪米特法则、合成复用原则、开闭原则、里氏替换原则

m0_68269137的博客 657

JAVA设计模式-七大原则

设计模式是程序员在面对同类软件工程设计问题所总结出来的有用经验,模式不是代码,而是某列问题的通用解决方案,设计模式代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的时间的实验和错误总结出来的。设计模式的本质是提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。设计模式并不局限于某种语言,Java,php,c++ 都有设计模式。

weixin_49799418的博客 188

【设计模式_七大原则_23种模式】

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。“ 设计模式是软件工程中一种通用的,可复用的一种解决方案,它是一种解决问题的。是一套反复被使用的、经过分类编目的、家喻户晓的、代码设计经验的总结。设计模式:可复用面向对象软件的基础。

十二_的博客 323

彻底搞懂设计模式DesignPattern-23种设计模式整理

设计模式介绍 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案, 设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂 度。 <<设计模式>> 是经典的书,作者是 Erich Gamma、 Richard Helm、 Ralph Johnson 和 John Vlissides

Ping 1105

Java设计模式---设计模式概述及七大原则

网课指路:尚硅谷Java设计模式(图解+框架源码剖析)_哔哩哔哩_bilibili设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的 1) 代码重用性 (即:相同功能的代码,不用多次编写) 2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理解) 3) 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护) ...

TIANJIAWEN的博客 432

七大设计原则源码详解

七大设计原则设计原则设计模式1.Open-Closed Principle 开闭原则2.Dependence Inversion Principle 依赖倒置原则3.Simple Responsibility Principle 单一职责原则4.Interface Segregation Principle 接口隔离原则5.Law of Demeter 迪米特原则6.Liskov Substitution Principle 里氏替换原则7.Composite/Aggregate Reuse Princip

长风舞月的博客 536

[设计模式]设计模式的七大原则

一、设计模式的目的 设计模式是为了更好的代码重用性,可读性,可靠性,可维护性,可扩展形。 二、设计模式的原则 开闭原则:对扩展开放,对修改关闭 注解:一段程序应该尽量保持在对扩展友好,但是尽量不修改原有的逻辑。 依赖倒转原则:高层模块不应该依赖底层模块,它们都应该依赖抽象;要针对抽象层编程,而不要针对具体类编程。 注解:抽象指的是接口或抽象类,细节就是具体的实现类,使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。 单一职责原则:类的职责要单一,

huang11055的专栏 174

【设计模式——学习笔记】设计模式介绍+七大设计原则介绍+23种设计模式汇总

本文探讨了软件工程中关键的设计模式与原则,包括设计模式的概念及其重要性,如提升代码的可维护性、扩展性和复用性。深入介绍了七大设计原则:单一职责、开闭、里氏替换、接口隔离、依赖倒置、迪米特法则及合成复用原则,每个原则均附带实例说明,如单一职责原则下交通工具类的重构,以及依赖倒置原则中接口的引入。

我只管埋头前行,剩下的交给时间。 1772

七大原则——最少知识原则

迪米特法则的定义 迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修...

m0_37654408的博客 1430
上一篇: php与设计模式-单例模式
下一篇: php大文件上传配置
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值