dream

一个菜鸟程序员的成长历程

0%

第一章课后复习题

  1. “主机”和“端系统”之间有什么不同?列举几种不同类型的端系统。web服务器是一种端系统吗?

没什么不同,主机即端系统。
手机是端系统,ipad是端系统,智能音箱是端系统。
web服务器也是一种端系统。

  1. “协议”一词常被用于描述外交关系。维基百科是怎样描述外交协议的。

直接去维基百科看

  1. 标准对于协议为什么重要?

如果都使用不同的协议,那么就没法交互了。所以需要标准来统一协议。

  1. 列出6种接入技术,将它们分为住宅接入,公司接入或广域无线网络接入。

同轴电缆 住宅接入
混合光纤同轴电缆(HFC)住宅接入
FTTH 住宅接入,公司接入
双绞线 住宅接入
WIFI 住宅接入,公司接入,广域无线网络接入
4G 广域无线网络接入

  1. HFC传输速率在用户间是专用的还是共享的?在下行HFC信道中,可能出现碰撞吗?为什么?

共享的。
不会,在下行信道,所有的分组从头到尾有同一个源发出,因此不会发生冲突。

  1. 以太LAN的传输速率是多少

用户10Mbps,100Mbps,服务器1Gbps,10Gbps

  1. 能够运行以太网的一些物理媒体是什么?

同轴电缆,光纤,双绞铜线

  1. 拨号调制解调器,HFC,DSL和FTTH都用于住宅接入,对于这些技术中的每一种,给出传输速率的范围,并讨论有关带宽是共享的还是专用的

拨号是专用的
HFC,DSL,FTTH都是用户共享的

  1. 假定在发送主机和接收主机间只有一台分组交换机。发送主机和交换机间以及交换机和接收主机间的传输速率分别是R1和R2。假设该交换机使用存储转发分组交换方式,发送一个长度为L的分组的端到端总时延是什么?(忽略排队时延,传播时延和节点处理时延)

从发送主机到交换机的传输时延是 L/R1
从交换机到接受主机的传输时延是 L/R2
端到端总时延 = L/R1 + L/R2

  1. 与分组交换网络相比,电路交换网络有哪些优点?在电路交换网络中,TDM比FDM有哪些优势?

电路交换网络独占带宽,速率更加稳定,建立好链接好只需要传输数据,不需要拥塞控制,流量控制,丢包等问题。

FDM是划分频率,TDM是划分时隙。发生丢失数据的话,TDM只会丢失一个时隙的数据,而FDM可能是大部分。

  1. 假定用户共享一条2Mbps链路。同时假定当每个用户传输时连续以1Mbps传输,但每个用户仅传输20%的时间。
    a. 当使用电路交换时,能够支持多少用户?
    b. 作为该题的遗留问题,假定使用分组交换。为什么如果两个或更少的用户同时传输的话,在链路前面基本没有排队时延?为什么如果3个用户同时传输的话,将会有排队时延?
    c. 求出某指定用户正在传输的概率。
    d. 假定现在有3个用户。求出在任何给定时间,所有3个用户在同时传输的概率。求出队列增长的时间比率。

a: 电路交换可以支持两个用户。
b: 因为两个用户每个用户1Mbps传输速率,两个刚好2Mbps占满了链路,当3个的时候,对于交换机来说输入速率就变成了3Mbps,而输出还是2Mbps,所以会产生排队。
C: 20%
d: 0.2 * 0.2 * 0.2 = 0.008

  1. 为什么在等级结构相同级别的两个ISP通常互相对等?某IXP是如何挣钱的?

因为互相对等可以直接连接,节省从上层ISP的时间和钱。
IXP通过流量对ISP收费

  1. 某些内容提供商构建了自己的网络。描述谷歌的网络。内容提供商构建这些网络的动机是什么?

绕过顶层ISP,直接和接入ISP互联,减少向顶层ISP的付费,并且可以对网络有更多的控制和操作。

  1. 考虑从某源主机跨越一条固定路由向某目的主机发送一分组。列出端到端时延组成部分。这些时延中的哪些是固定的,哪些是变化的?

总时延 = 节点处理时延 + 排队时延 + 传输时延 + 传播时延
变化的是节点处理时延 + 排队时延
固定的是传输时延 + 传播时延

  1. 访问在配套Web网站上有关传输时延与传播时延的Java小程序。在可用速率、传播时延和可用的分组长度之中找出一种组合,使得该分组的第一个比特到达接收方之前发送方结束了传输。找出另一种组合,使得发送方完成传输之前,该分组的第一个比特到达了接收方。

传输时延 < 传播时延的时候,传输完了第一个比特还没有到达接收方。
传输时延 > 传播时延的时候,传播完了还没传输完,也就是第一个比特到达接收方还在传输。

  1. 一个长度为1000字节的分组经距离2500km的链路传播,传播速率为2.5x10^8m/s并且传输速率为2Mbps,它需要多长时间?更为一般地,一个长度为L的分组经距离为d的链路传播,传输速率为s并且传播速率为Rbps,它需要用多长时间?该时延与传输速率相关吗?

传输时延 = 1000 / 2000000 = 0.0005s
传播时延 = 2500 / 250000 = 0.01s
需要 0.0105s 忽略节点处理时延和传播时延
L/s + d/Rbps
相关

  1. 假定主机A要向主机B发送一个大文件。从主机A到主机B的路径上有3段链路,其速率分别为R1 = 500kbps,R2 = 2Mbps,R3 = 1Mbps。
    a. 假定该网络中没有其他流量,该文件传送的吞吐量是多少?
    b. 假定该文件为4MB。传输该文件到主机B大致需要多长时间?
    c. 重复(a)和(b),只是这时R2减小到100kbps。

a: 吞吐量取决于最小的速率也就是500kbps。
b: 4000 * 8 / 500 = 64s
c: 吞吐量 = 100kbps 传输时间 = 4000 * 8 / 100 = 320s

  1. 假定端系统A要向端系统B发送一个大文件。在一个非常高的层次上,描述端系统怎样从该文件生成分组。当这些分组之一到达某分组交换机时,该交换机使用分组中的什么信息来决定将该分组转发到哪一条路上?因特网中的分组交换为什么可以与驱车从一个城市到另一个城市并沿途询问方向相类比?

报文-段-数据报-帧
使用目的ip地址和路由转发协议决定
路由转发协议使用了转发表,查询转发表和问路类似,一个路由器和一个城市类似

  1. 访问配套Web站点的排队和丢包Java小程序。最大发送速率和最小的传输速率是什么?对于这些速率,流量强度是多少?用这些速率运行该Java小程序并确定出现丢包要花费多长时间?然后第二次重复该实验,再次确定出现丢包花费多长时间。这些值有什么不同?为什么会有这种现象?

  1. 列出一个层次能执行的5个任务。这些任务中的一个(或两个)可能由两个(或更多)层次执行吗?

传输层 tcp协议:差错检测,分组重传,流量控制,拥塞控制,建立连接

可能,传输层有差错检测,网络层也有差错检测。

  1. 因特网协议栈中的5个层次有哪些?在这些层次中,每层的主要任务是什么?

应用层:完成自己的应用功能 http,icmp,ftp应用执行
传输层:完成端到端传输 tcp udp协议 确定源和目的端口号 进程传输
网络层:完成网络的端到端传输 IP协议 源和目的ip地址 主机传输
数据链路层:完成数据的端到端传输 MAC协议 到下一个节点的传输
物理层:完成比特流的端到端传输 实际物理传输

  1. 什么是应用层报文?什么是传输层报文段?什么是网络层数据报?什么是链路层帧?

应用层报文就是数据报文
传输层:增加源和目的端口号封装成段
网络层:增加源和目的ip地址,封装成数据报
链路层:增加MAC地址,封装成帧

  1. 路由器处理因特网协议栈中的哪些层次?链路层交换机处理的是哪些层次?主机处理的是哪些层次?

主机处理所有层次
路由器处理物理层,链路层,网络层三层
交换机处理物理层,链路层两层

  1. 病毒和蠕虫之间有什么不同?

病毒:需要用户交互才能感染设备
蠕虫:不需要用户交互

  1. 描述如何产生一个僵尸网络,以及僵尸网络是怎样被用于DDoS攻击的。

恶意软件控制网络设备产生僵尸网络
恶意软件控制僵尸网络不断攻击服务器,发送大量分组,创建大量链接,让正常请求被服务器忽略或拒绝。

  1. 假定Alice和Bob经计算机网络相互发送分组。假定Trudy将自己安置在网络中,使得她能够俘获由Alice发送的所有分组,并发送她希望给Bob的东西;她也能俘获Bob发送的所有分组,并发送她希望给Alice的东西。列出在这种情况下Trudy能够做的某些恶意的事情。

假扮成Alice或者Bob发送恶意软件
盗取Alice和Bob的信息

应用层

应用层协议原理

两种架构

  • C/S 客户-服务器架构
  • P2P 对等架构

P2P的自扩展性:尽管每个对等方都请求文件产生工作量,但每个对等方也向其他对等方分发文件增加系统服务能力。

未来P2P面临的三大挑战:

  • ISP友好。
    大多数ISP都是下载比上传快。但是P2P加大了上传流量,给ISP带来了压力。需要设计对ISP友好的P2P。
  • 安全性。
    因为高度分布和开放特性。给安全带来了挑战。
  • 激励
    未来P2P的成功也取决于说服用户自愿向应用提供带宽,存储和计算资源。这对激励设计带来挑战。

进程通信

实际通信的是计算机上面的进程。
通过IP地址确定一个主机。通过端口号确定一个进程。
计算机提供了一套socket套接字。

使用的运输层服务

看几个方面:

  • 可靠数据传输
  • 吞吐量 带宽敏感
  • 时延
  • 安全

因特网提供的运输服务

TCP

  • 建立连接
  • 可靠数据传输
  • 流量控制
  • 拥塞控制

UDP

轻量级,全部由应用层实现

应用层协议

  • 交换的报文类型, 例如请求报文和响应报文
  • 各种报文类型的语法,如报文的各个字段及这些字段是如何描述的。
  • 字段的语义,这些字段中包含的信息的含义。
  • 一个进程何时以及如何发送报文,对报文进行响应的规则。

Web和HTTP

HTTP的RFC文档

  • RFC 1945
  • RFC 2616

报文格式

请求报文

  • 请求行
  • 首部行
  • 空行
  • 请求体

响应报文

  • 状态行
  • 首部行
  • 响应体

HTTP本身是无状态的,通过cookie可以实现身份记录。

cookie技术有4个组件

  • HTTP响应报文中的一个cookie首部行
  • HTTP请求报文中的一个cookie首部行
  • 用户端系统有一个cookie文件
  • WEB站点的一个后端数据库

WEB缓存

WEB缓存器也叫代理服务器,它是能代表初始WEB服务器来满足HTTP请求的实体。WEB缓存服务器有自己的磁盘空间,保存最近请求过的对象的副本。

CDN就是一种WEB缓存。

条件GET方法

尽管高速缓存能快速响应,但是存储的副本可能是陈旧的,过期的。

HTTP协议有一种机制,允许缓存器证实它是最新的。这种机制就是条件GET方法

  • 请求报文使用GET方法
  • 请求报文中包含一个“if-Modified-Since”首部行,内容是上次服务器返回的最新修改时间

WEB服务器会检查如果没有修改就返回一个304状态码,缓存就知道还是最新的。

文件传输FTP

HTTP和FTP都是文件传输协议。(RFC959)

一些重要的区别,最显著的是FTP使用两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接

控制连接用于在俩主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及存放获取文件的命令。

数据连接用于实际发送一个文件。

因为FTP使用一个独立的控制连接,所以我们也称FTP的控制信息是带外传送的。

FTP首先在21端口建立一个控制连接
FTP的客户端通过控制连接发送用户标识和口令,命令。
FTP的服务端收到传输文件的命令后,建立数据连接用来传输文件。
每个数据连接传输一个文件后关闭。

FTP命令和回答

命令和回答都是以7比特的ASCII格式在控制连接上发送的。为了区分连续的命令,每个命令后跟回车换行符。

  • USER username: 用于向服务器发送用户标识
  • PASS password: 用于向服务器发送用户口令
  • LIST :用于请求服务器回送当前远程目录中的所有文件列表。该文件列表是一个数据连接发送的。
  • RETR filename: 用于从远程主机当前目录检索文件。该命令引起远程主机发起数据连接传输该文件到本地客户端。
  • STOR filename: 用于在远程主机当前目录存放文件。就是往远程主机传输文件。

一些典型回答:

  • 331 Username OK, Password required(用户名Ok,需要口令)
  • 125 Data connection already open: transfer starting (数据连接已经打开,开始传送)
  • 425 Can’t open data connection (无法打开数据连接)
  • 452 Error Writing File (写文件出错)

电子邮件

邮件有三部分

  • 用户代理
  • 邮件服务器
  • 简单邮件传输协议

发送邮件过程

  • 发送方的用户代理 到 发送方的邮件服务器
  • 发送方的邮件服务器 到 接收方的邮件服务器
  • 接收方的邮件服务器 到 接收方的用户代理邮箱

SMTP

RFC 5321 给出了SMTP的定义。SMTP使用TCP协议。只能传输7比特的ASCII表示。

发送过程:

  • 客户端建立连接
  • S:220 hamburger.edu
  • C:HELO crepes.fr
  • S:250 Hello crepes.fr,pleased to meet you
  • C:MAIL FROM: alice@crepes.fr
  • S:250 alice@crepes.fr … sender ok
  • C:RCPT TO: bob@humburger.edu
  • S:250 bob@humburger.edu …. Recipient ok
  • C:DATA
  • S:354 Enter mail, end with “.” on a line by itself
  • C:Do you like ketchup?
  • C:How about you pickets?
  • C:.
  • S:250 Message accepted for delivery
  • C:QUIT
  • S:221 hamburger.edu closeing connection

和HTTP对比

HTTP 是一个拉协议,从服务器拉取数据。
SMTP 是一个推协议,往服务器推送邮件。

HTTP 可以任意表示
SMTP 只能7比特ASCII表示。

HTTP 每个对象一个响应
SMTP 一个邮件多个对象

SMTP典型的首部报文

FROM:
TO:
Subject:

获取邮件协议

POP3 和 IMAP

POP3

pop3分为3个阶段

  • 特许:用户代理发送用户名和口令(明文)
  • 事务处理:用户代理取回报文,做删除报文的标记,取消删除标记,获取邮件的统计信息。
  • 更新阶段:发生在客户端QUIT指令后,结束会话,删除那些标记的报文。

特许阶段有两个主要命令

  • user
  • pass

事务处理阶段有4个主要命令

  • list 列出邮件列表
  • retr id 读取邮件内容
  • delete 删除邮件
  • quit 退出

IMAP

imap比pop3更加复杂,增加了远程文件夹功能。imap支持用户读取报文的一部分,比如只读取首部,或多部分MIME的一部分。当宽度低的时候非常有用。

DNS

DNS使用UDP协议。

DNS完成域名和ip地址的转换。

域名分为

  • 根DNS服务器
  • 顶级DNS服务器 com,org,edu,cn
  • 权威DNS服务器

请求

迭代请求

  • 请求根服务器
  • 根服务器返回
  • 请求顶级服务器
  • 顶级服务器返回
  • 请求权威
  • 权威返回

递归请求

  • 请求根
  • 根请求顶级
  • 顶级请求权威
  • 权威返回顶级
  • 顶级返回根
  • 根返回

TCP套接字

遵守RFC协议文档的应用程序是“开放”的。不遵循RFC文档中的协议的应用程序是“专用”的。

UDP套接字

如何用AI打造一个爆款视频,涨粉1000+

引言

在数字化时代,视频内容已成为最有力的传播媒介之一,它以其直观和生动的特性吸引着全球观众的注意力。对于程序员和其他希望通过副业赚钱的群体来说,视频平台不仅提供了一个展示技能、分享知识和创造收入的绝佳机会,而且随着技术的进步,视频创作不再是专业人士的专利,普通用户也能通过简单的工具创作出高质量的视频内容。

AI技术的发展为视频创作带来了革命性的变化。AI不仅可以帮助自动化视频编辑过程,还能在内容创作、市场分析和用户互动等方面提供支持。对于目标画像中的程序员来说,AI技术的应用不仅能提高创作效率,还能帮助他们更好地理解观众需求,创作出更受欢迎的视频内容。

程序员通常具有强大的逻辑思维和问题解决能力,但在视频创作方面可能缺乏经验和技能。他们面临的挑战包括如何创作吸引人的内容、如何有效推广视频以及如何将视频转化为收入。此外,他们可能还需要在繁忙的工作之余找到时间来管理副业。本文将探讨如何利用AI技术帮助这一群体克服这些挑战,实现他们的目标。

AI如何帮助提升视频编辑效率?

  • 自动化视频编辑:
    AI能够自动识别视频中的关键帧、场景变换和语音内容,帮助自动剪辑视频,减少人工编辑的时间和精力。例如,通过AI分析音频波形和视频内容,可以自动将视频剪辑成用户设定的长度,自动匹配背景音乐的节奏。

  • 内容创意生成:
    AI可以基于已有的数据和趋势,生成创意内容建议,包括视频主题、故事板和视觉效果等。利用AI的生成性对抗网络(GANs),可以创建逼真的视频背景、人物。

  • 智能剪辑工具:
    如Filmora和Descript这样的工具,它们提供基于文本的编辑、自动转录、AI辅助编辑功能,如自动填充词删除、录音室音效增强、眼神接触校正和自动剪辑创建,简化编辑过程。

  • 一键包装和AI封面生成:
    一些AI工具允许用户一键添加字幕、特效、贴纸等,快速制作出具有综艺感的口播视频。同时,AI技术能智能分析视频内容,一键生成吸引眼球的视频封面。

  • 画质修复和AI消除:
    AI技术能高清修复渣糊画质的视频,提升视频的整体观感。同时,提供批量去除视频中的字幕和水印的功能,帮助用户获得干净的视频画面。

  • 视频转录和翻译:
    AI视频编辑工具如Descript,可以自动转录音频和视频文件,轻松添加字幕以提高可访问性和参与度。Vozo则是一款AI驱动的短视频工具,能够一键重写视频脚本并重新配音,保留原说话者的音色、语气和口型同步。

  • 智能分析和音频视频创作:
    一站式AI智能分析和音频视频创作神器可以大幅提高创作效率,例如通过智能分析技术,在视频中添加精准的视觉效果和动态元素。

  • 全自动的内容生成与剪辑:
    未来的AI技术将能够根据预设的风格和情感要求,自动生成并剪辑完整的视频内容,极大提升视频制作的效率。

通过这些方式,AI技术帮助视频编辑工作变得更加高效和精准,降低了专业技能的门槛,使得视频创作更加便捷和快速。这对于程序员和其他对AI感兴趣的创作者来说,是一个巨大的优势,他们可以利用自己的技术背景,结合AI工具,快速提升视频创作能力,实现内容的快速产出和传播。

理解目标受众

程序员的背景和技能

程序员,作为技术行业的中坚力量,通常具备扎实的编程技能和对新技术的敏感度。他们习惯于解决问题,并且能够快速适应和学习新工具。在视频创作领域,程序员可以利用他们的技术背景来掌握AI视频编辑工具,这为他们提供了一个独特的优势。他们对逻辑和结构化思维的倾向也有助于在视频内容的组织和叙事上做出清晰的规划。

副业赚钱的动机和目标

许多程序员寻求副业来增加收入,提高生活质量,或者是为了追求个人兴趣和激情。视频创作作为一个灵活的副业选择,允许他们在业余时间进行创作,同时也有可能带来可观的收益。他们的目标可能包括建立个人品牌、增加被动收入、提升专业技能或者仅仅是为了娱乐和创造性的表达。

对AI的兴趣和应用场景

程序员通常对AI技术有着浓厚的兴趣,他们可能会探索AI在视频创作中的应用,以提高效率和创造力。AI的应用场景在视频创作中非常广泛,从自动化剪辑到内容创意生成,再到视频推广和分析,AI技术都能提供强大的支持。程序员可以利用这些工具来减少重复性工作,专注于创意和策略规划。

不同短视频平台的受众

短视频平台众多,但是每个平台都有它的受众,有常用它的人群,这些人群有不同的喜好。根据我发视频的结果来看,也是同样的。

同样的一个视频,同样的标题和简介,同样的标签,他们的播放量都是有区别的。

我发了不同类型的视频,在这里给大家做个参考。这里仅仅是播放量的参考。

  • 抖音:技术类视频还可以。影视类视频也还可以。可爱治愈系视频和AI诗词视频比较惨淡。
  • 微信视频号:可爱治愈系视频最好。AI诗词类和技术类视频一般。
  • 小红书:影视类视频最好,可爱治愈系和技术类视频一般。
  • B站:技术类视频最好,其他视频一般。

总体而言微信视频号的流量最大,但是转化最好的是B站,小红书和抖音。

如果大家做的是技术类视频,那么推荐B站和抖音。

挑战

程序员在视频创作中可能会遇到以下技术挑战:

非线性编辑的复杂性:
视频编辑通常涉及非线性编辑系统(NLE),这对于习惯于线性编程思维的程序员来说可能是一个挑战。他们需要适应在时间线上进行剪辑、添加效果和调整音频等操作。

视频和音频同步:
确保视频和音频的精确同步是视频制作中的一个常见问题。程序员可能需要学习如何使用专业软件来处理音频和视频的同步问题。

视频格式和编码:
视频文件有多种格式和编码标准,程序员需要了解这些格式之间的区别以及如何转换它们,以确保视频在不同平台和设备上的兼容性。

色彩校正和分级:
视频的色彩校正和分级是一个专业领域,程序员可能需要学习如何调整色彩平衡、对比度和饱和度,以达到视觉上的吸引力。

特效和动画:
在视频中添加特效和动画可能需要使用复杂的软件和插件,程序员可能需要掌握这些工具的使用,以及如何编程实现自定义效果。

视频压缩和优化:
为了在保持视频质量的同时减少文件大小,程序员需要了解视频压缩技术,包括选择合适的编码器和设置压缩参数。

跨平台兼容性:
不同的社交媒体平台和视频分享网站可能有不同的视频规格要求,程序员需要确保他们的作品能够适应这些不同的平台。

版权和法律问题:
使用音乐、图片和其他版权材料时,程序员需要了解版权法律,避免侵犯他人版权,这可能需要额外的法律知识。

硬件性能要求:
高质量的视频编辑需要较强的硬件支持,程序员可能需要升级他们的计算机硬件,以满足视频编辑软件的性能要求。

用户界面和用户体验设计:
程序员可能习惯于编写代码,但在视频创作中,他们还需要关注用户界面(UI)和用户体验(UX)的设计,以确保视频内容对观众友好。

内容创意和叙事结构:
虽然程序员在技术实现方面可能很强,但内容创意和叙事结构的构建可能是他们的弱项,这需要他们开发新的思维模式和技能。

视频推广和SEO:
为了让视频获得更多的观看和分享,程序员需要学习视频推广和搜索引擎优化(SEO)的策略,以提高视频在搜索结果中的排名。

程序员在视频创作中遇到的技术挑战是多方面的,需要他们不断学习和适应。随着AI技术的发展,许多挑战可以通过智能工具和自动化流程来解决,这为程序员提供了新的解决方案和创作可能性。

AI工具准备

通过下面的工具,可以解决我们大部分的问题,但是还有一些问题需要我们自己来解决,比如上面的推广、剪辑、创意性、选题等。

想做AI视频,那么AI视频需要以下的一些步骤和对应的工具:

  • 剧本创作:可以使用Kimi或者豆包或者GPT都可以。
  • 分镜创作:同样的,Kimi或者豆包或者GPT都可以。
  • 图片生成:可以使用一些图片生成AI。包括可灵,即梦,midjourney等。
  • 影视生成:可以使用可灵,即梦,RunWay等。
  • 音频生成:可以使用ttsmaker,魔音工坊等。
  • 视频剪辑:即梦,IMovie, 剪映等。
  • 去除水印:腾讯智影。

AI技术在视频创作中的应用

AI技术在视频创作中的应用为程序员和其他创作者提供了强大的工具,以克服技术挑战并提升创作效率。以下是AI技术在视频创作中的一些关键应用:

视频内容生成

脚本编写:
AI可以辅助编写视频脚本,通过分析流行视频的内容和结构,提供创意点子和叙事框架。这不仅节省了时间,还能确保内容的吸引力和观众的参与度。

场景设计:
利用AI生成的场景设计工具,程序员可以快速创建视频背景和动画,无需手动绘制每一帧。AI可以根据视频主题自动推荐配色方案和设计风格,使视频更具视觉冲击力。

视频编辑和优化

视频剪辑:
AI视频编辑工具能够自动识别视频中的最佳时刻,如表情、动作和对话,自动剪辑视频,节省了大量的手动剪辑工作。这些工具还可以预测剪辑点,使视频流畅自然。

色彩校正:
AI可以分析视频的色彩分布,并自动调整色彩平衡、对比度和饱和度,以达到专业级别的视觉效果。这种智能色彩校正功能使得即使没有专业经验的程序员也能制作出高质量的视频。

音频处理:
AI技术可以自动分离和增强视频中的音频,消除背景噪音,增强人声,甚至自动添加背景音乐。这使得视频的音频质量得到提升,增强了观看体验。

视频发布和推广

关键词优化:
AI可以帮助分析视频内容和观众反馈,自动生成和优化视频标题、描述和标签,提高视频在搜索引擎中的排名,增加视频的曝光率。

社交媒体分析:
AI工具可以分析社交媒体趋势和用户行为,为视频发布提供最佳时间和策略建议。这些工具还可以预测哪些内容更有可能获得观众的喜爱,帮助程序员制定更有效的内容计划。

通过这些AI技术的应用,程序员可以更专注于创意和策略,而不是技术细节。AI技术不仅提高了视频创作的效率,还降低了进入视频创作领域的门槛,使得程序员能够利用自己的技术背景,快速适应并掌握视频创作的过程。

爆款视频的创作策略

确定视频主题和风格

市场调研与趋势分析:
利用AI工具进行市场调研,分析当前流行趋势和观众偏好。例如,通过分析社交媒体上的热门话题和视频,AI可以帮助确定哪些主题和风格更受欢迎。这有助于创作者选择能够引起共鸣和关注的题材。

目标受众定位:
明确视频的目标受众,并根据受众的特点定制内容。AI可以帮助分析特定受众群体的行为和偏好,从而制作出更有针对性的视频内容。

内容差异化:
在众多视频中脱颖而出的关键在于差异化。AI可以帮助分析竞争对手的内容,找出差异化的切入点,如独特的视角、新颖的故事讲述方式或者创新的视频风格。

利用AI进行市场调研

关键词分析:
使用AI工具进行关键词分析,找出与视频主题相关的热门搜索词,这些关键词可以用于视频的标题、描述和标签,以提高视频在搜索引擎中的排名。

情感分析:
AI情感分析工具可以评估社交媒体上对特定话题的公众情绪,帮助创作者理解观众的情感反应,从而调整内容以更好地满足观众的情感需求。

竞品分析:
AI可以分析竞争对手的视频内容,提供关于他们成功元素的洞察,如视频长度、编辑风格、使用的音效等,从而为创作者提供灵感。

创作引人入胜的内容

故事叙述:
好的故事叙述是吸引观众的关键。AI可以帮助创作者构建引人入胜的叙事结构,通过分析成功的视频案例,提供故事发展的建议。

视觉效果优化:
AI工具可以提供关于视频视觉效果的优化建议,如色彩搭配、场景转换等,以增强视频的视觉冲击力。

互动性增强:
AI可以帮助创作者在视频中加入互动元素,如问答、投票等,以提高观众的参与度和互动性。

视频制作的技术细节

视频格式和编码选择:
根据目标平台和受众设备,AI可以建议最合适的视频格式和编码设置,以确保视频在不同设备上都能流畅播放。

音频优化:
AI音频分析工具可以帮助创作者优化音频质量,包括音量平衡、噪音消除和音质增强,以提供更好的听觉体验。

特效和动画:
AI驱动的特效和动画工具可以简化这些复杂元素的添加过程,使创作者能够快速实现创意视觉效果。

视频内容的优化和迭代

利用AI分析观众反馈

评论分析:
AI可以分析视频下的评论,识别出观众的正面和负面反馈,以及他们对视频内容的具体建议。这些数据可以帮助创作者了解观众的需求和期望,从而调整内容策略。

观看行为分析:
通过分析观众的观看行为,如观看完成率、跳过率和重复观看次数,AI可以提供关于视频哪些部分最吸引人、哪些部分需要改进的洞察。

情感识别:
利用AI的情感识别技术,可以从观众的面部表情和语音语调中分析出他们的情感反应,这对于理解观众的真实感受非常有用。

调整内容策略

内容优化:
根据AI分析的结果,创作者可以对视频内容进行优化,比如增强那些观众反应积极的内容元素,减少或修改那些反应消极的部分。

风格调整:
如果AI分析显示观众对某种风格或类型的视频更感兴趣,创作者可以调整自己的视频风格,以更好地吸引目标受众。

发布时间优化:
AI可以帮助分析不同发布时间对视频表现的影响,从而找到最佳的发布时间,以提高视频的曝光率和观看量。

持续优化视频质量

技术升级:
随着AI技术的进步,创作者可以利用最新的AI工具来提升视频质量,比如使用更先进的自动剪辑工具、更高质量的自动字幕生成器等。

创意迭代:
AI可以提供创意迭代的建议,比如通过分析流行趋势和观众反馈,帮助创作者不断更新和创新视频内容。

互动和社区建设:
AI可以帮助创作者设计更有效的观众互动策略,比如通过分析观众的互动数据来设计问答环节、投票和挑战等,以增强观众的参与感和社区归属感。

通过这些方法,创作者可以不断优化和迭代自己的视频内容,以适应不断变化的观众需求和市场趋势。这不仅有助于提升视频的吸引力和观看量,还能增强观众的忠诚度,为创作者带来长期的成功。

实战案例

首先准备上面的AI工具。开始实战,大胖橘的一天。

剧本制作

剧本制作我们使用豆包就可以。提示词如下。我们让豆包给出5份剧本,可以从里面选出自己想要的,如果没有的话就再让它生成一份。每个分镜是5s,因为大部分AI视频都是5s。

1
2
3
4
5
6
7
8
9
10
11
12
13
#背景:我是一个短视频爱好者。 
#角色:你是一个专业的影视导演。擅长制作电影镜头,分镜,每个分镜5s,请合理安排镜头和画面音频运镜方式。
#技能:
1. 根据用户输入的信息可以生成专业的影视剧本。
2. 根据剧本生成分镜,每一个分镜是5s
3. 合理安排分镜的画面音频和运镜。
4. 根据用户的需求继续完善剧本和镜头。
# 工作流:
1. 引导用户输入 角色,时间,地点,事件。
2.接收到信息以后开始生成剧本和分镜。
3.输出分镜内容,以表格形式,每一个分镜镜头是5s,还要包括运镜方式、画面、音频、音效。
4. 总共输出5份内容
5. 输出以后给出最佳实践

接下来我们给出一些信息。如下。

1
2
3
4
5
6
角色:可爱的大胖橘。
时间:早上,地点:家里。事件:起床洗漱准备出门。
时间:早上。地点:上班路上。事件:骑上心爱的小摩托上班。
时间:上午。地点:办公室。事件:上班。
时间:下午。地点:办公室。事件:做错事被老板骂。
时间:晚上。地点:卧室。事件:疲惫的躺在床上

接下来等待豆包给出剧本和分镜信息。

1

图片制作

接下来使用即梦AI来生成图片。

我们只需要把画面信息粘贴过去就可以了。比列选择9:16。模型可以自己对比,我选择的是图片2.1

1
大胖橘慵懒地窝在柔软的被窝里,眼睛慢慢睁开,伸着懒腰,被子被拱起.

生成内容如下:

2

接下来把每一个镜头都生成图片就可以了。

分镜制作

现在图片已经生成好了,接下来准备生成5s的分镜。同样用即梦AI就可以了。

  • 选择视频生成
  • 选择图片生视频
  • 上传图片
  • 选择视频模型:我用的默认的S2.0,也可以用其他的试试效果。

接下来生成每一个镜头就可以了。

音频制作

这里我使用的是ttsmaker音频生成。

把我们要生成的语音文字和停顿信息,速度选择好,然后点击生成就可以了。

我这里的文字和停顿。我选择的是1.1倍速,每个段落停顿时间200ms。声音我选择的是1518大鹏

1
2
3
4
5
6
7
大胖橘闹钟在床边响起,爪子从被窝伸出按掉闹钟。
走进浴室,打开淋浴喷头,水洒下来,开始享受。
洗漱完毕,在镜子前整理自己的仪表,左看看右看看。((⏱️=500))
走到门口鞋柜处,叼起钥匙,回头看一眼屋子。((⏱️=700))
骑着小摩托在路上,穿梭在车流中,旁边车辆呼啸而过。
坐在办公桌前,对着电脑屏幕愁眉苦脸,文档上满是修改标记。
晚上趴在卧室床上,四肢摊开,眼神空洞地望着天花板。

点击开始转换,接着可以试听,然后下载文件到本地。

3

视频剪辑

当每一个镜头都制作好了以后,就可以通过视频剪辑工具,把镜头放到一起了。

4

把视频放到下面,把音频也放到下面。

5

添加自己喜欢的转场动画,然后点击导出就可以了。

去水印

接下来使用腾讯智影去掉视频里面的水印。

  • 选择智能抹除
  • 本地上传
  • 将水印框住: 注意绿色的是水印框。

6

点击确定,等待完成。接下来在下面的最近作品里面点击下载即可。

题目

一个好的题目可以让视频更加火爆,题目可以自己取也可以让AI帮你取。

比如我让豆包给我取一个。我输入的提示词:

1
2
3
赛道领域:可爱小猫治愈系视频 
产品类型:大胖橘猫的一天
目标用户画像:性别:不限,可根据不同性别定制化。年龄段:不限。地域:不限。职业:工作劳累的上班族和大学生,需要放松的人。收入:收入在5万-30万之间的。

豆包给我输出的。

7

从里面选择一个就可以了。

简介

简介也可以让AI生成。同样使用豆包。

输入提示词。

1
2
3
赛道领域:可爱小猫治愈系视频 
产品类型:大胖橘猫的一天
目标用户画像:性别:不限,可根据不同性别定制化。年龄段:不限。地域:不限。职业:工作劳累的上班族和大学生,需要放松的人。收入:收入在5万-30万之间的。

豆包给我输出的。

7

接下来就可以发出去啦

总结

首先要进行选择题目,选择短视频平台受众。

接下来利用AI生成剧本、分镜、图片、视频、音频。

然后通过剪辑软件进行合并成一个视频。

最后在去除水印。

还可以通过AI生成标题和简介。

就可以去发布啦!

设计模式之享元模式–共享内存来节省空间

享元模式是说共享单元,如果有一样的部分那么共享一个组件而不是复制,也就是传址不传值。

运用共享技术有效地支持大量细粒度的对象。

为什么要使用享元模式

享元模式体现在很多地方,比如后端共享一套代码给前端各个平台,很多接口都是同一个。

享元模式是复用性的体现,大量节省了空间。

比如棋牌游戏,棋子和牌都是一样的,那么他们就可以复用同一个。

五子棋游戏

五子棋只有黑子白子,虽然我们用到了很多,但是他们其实指向了同一个内存空间,只不过创建了很多对象而已。

象棋游戏

象棋也只有车马炮这些棋子,同样可以复用,不然如果你每个棋局重新创建,那么内存很容易溢出。

扑克牌游戏

扑克牌也只有123到大王这些固定的牌。

递归算法

很多递归算法也可以通过享元模式来优化,递归到最后其实有很多是重复的值,而如果每个重复的值都需要重新占用空间,那么造成了大量的空间浪费,这也是递归慢和容易内存溢出的原因之一。

享元模式其实很简单,就是有需要的时候把已经存在的东西拿出来复用。

比如可以通过数组存储,然后需要的时候直接复用就好了。

比如通过简单工厂来创建对象的时候,如果有很多请求过来访问这个工厂,那么工厂需要创建很多对象返回。

而如果通过数组存起来,那么只返回一个对象,就节省了空间。

当然了,享元模式共享的只能是可读对象,一定是不可修改的。

如果可以修改就会造成某个地方修改而其他地方不可用的bug。

设计模式之组合模式–树形结构的最佳实践

组合模式是部分组合成整体。

将对象组合成树形结构以表示’部分’-‘整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

为什么要使用组合模式

最常用到组合模式的应该就是树形结构了。

比如公司-部门的结构,文件夹-文件的结构。

首先有一个共同的父类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

/**
* 组合模式
* 组合抽象类
* 组合的部件和整体都继承这个抽象类,组合出这个抽象类的整体
*/
abstract class Component {

protected $name;

public function __construct($name) {
$this->name = $name;
}

/**
* 增加一个Component类型的对象
*/
public abstract function add(Component $component);

/**
* 删除一个Component类型的对象
*/
public abstract function remove(Component $component);

/**
* 展示结构
*/
public abstract function show(int $depth);

}

然后实现支节点和叶子节点两个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use Illuminate\Support\Arr;
/**
* 组合模式
* 组合的支节点,可以有子节点,字节的需要是Component类型
*/
class Composite extends Component {

private $arr = [];

/**
* 增加一个Component类型的对象
*/
public function add(Component $component){
$this->arr[] = $component;
}

/**
* 删除一个Component类型的对象
*/
public function remove(Component $component) {
Arr::where($this->arr, function ($value, $key) use ($component) {
if ($value == $component) {
unset($this->arr[$key]);
}
});

}

/**
* 展示结构
*/
public function show(int $depth) {
dump(str_repeat('-',$depth) . $this->name);
foreach ($this->arr as $k => $v) {
$v->show(2+$depth);
}
}

}

/**
* 组合模式
* 组合的叶子节点
* 叶子节点不能添加和移除字节点
*/
class Leaf extends Component {

/**
* 增加一个Component类型的对象
*/
public function add(Component $component){
return '';
}

/**
* 删除一个Component类型的对象
*/
public function remove(Component $component) {
return '';
}

/**
* 展示结构
*/
public function show(int $depth) {
dump(str_repeat('-',$depth) . $this->name);
}

}

客户端通过任意添加子节点的方式来完成组合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

$root = new Composite('root');
dump($root);
$a = new Composite('a');
$root->add($a);
dump($root);
$root->remove($a);
dump($root);
$root->add($a);
$ab = new Leaf('ab');
$a->add($ab);
$b = new Composite('b');
$root->add($b);
$root->show(0);

composite

代码放在了我的github上面。

设计模式之外观模式–抽象出高层接口更加易用

外观模式是套个壳子,隐藏细节。

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使子系统更加易用。

为什么要使用外观模式

外观模式是对底层的抽象,隐藏你不该知道的东西,暴露你应该知道的东西,更加符合迪米特法则接口隔离原则

外观模式的本质同样是套壳子,比如你有一个缓存系统。

这个缓存系统存入数据需要

  1. 加锁
  2. 存数据
  3. 释放锁

我们的客户端实现

1
2
3
4
5
6
7
8
9
10
11

//加锁
$lock = new lock;
$lock->lock();

//存入数据
$redis = new redis;
$redis->set();

//释放锁
$lock->unlock();

这只是比较简单的几步,有的可能会更加复杂,你需要调用多个接口。

这样的话可以使用外观模式封装一下这些细节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/**
* 外观模式
* 外观的封装,对底层模块的封装
*/
class Facade {

/**
* 对存入缓存进行封装
*/
public function set() {
//加锁
$lock = new lock;
$lock->lock();

//存入数据
$redis = new redis;
$redis->set();

//释放锁
$lock->unlock();
}

}

使用外观的客户端

1
2
3

$facade = new Facade;
$facade->set();

其实外观就是封装的思想体现。

代码放在了我的github上面。

设计模式之适配器模式–不兼容变兼容接口

适配器模式可以增加接口的易用性,使得不兼容的接口变得兼容。

将一个接口转换成另外的接口,使得原本不兼容的接口变得兼容。

为什么要使用适配器模式

比如你的接口设计存在缺点,不够易用,不能复用但又希望复用的时候。

比如你要对接多个平台的接口他们互不兼容的时候。

现实中也有很多适配器,比如安卓苹果的转换头,比如usb到type-c的转换头,都是因为两边的接口不同,不兼容所以需要一个适配器。

下面是一个手机类,现在需要充电,但是手机的充电需要typec接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 适配器模式
* 手机类
*/
class mobile {

/**
* 给手机充电操作
*/
public function charge(ITypec $typec) {
dump('使用typec接口给手机充电');
$typec->typec();
}

}

现在只有一个usb接口可以充电。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 适配器模式
* 需要适配的类
* usb接口
*/
class usb {

/**
* 接口
*/
public function usb() {
dump('电脑usb接口');
}

}

我们增加一个适配器,也就是typec转usb的头。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 适配器模式
* 适配器接口
* typec接口
*/
interface ITypec {
/**
* 接口
*/
public function typec();

}

/**
* 适配器模式
* 适配器类,typec转换usb的适配器
* typec接口
*/
class typec implements ITypec {

private $usb;

function __construct() {
$this->usb = new usb;
}

/**
* 接口
*/
public function typec() {
dump('接口适配器');
$this->usb->usb();
}

}

我们的客户端就可以使用这个适配器了。

1
2
3
4

$mobile = new mobile();

$mobile->charge(new typec);

这是对象适配器,还有类适配器,类适配器的话需要继承要适配的类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

/**
* 适配器模式
* 适配器类,typec转换usb的适配器
* typec接口
*/
class typec extends usb implements ITypec {

//不再需要存储对象,直接继承了

/**
* 接口
*/
public function typec() {
dump('接口适配器');
//$this->usb->usb();
//这里改成使用父类的usb方法。
parent::usb();
}

}

适配器和代理模式还有装饰器模式的区别

这几个设计模式其实都差不多,你也可以说使用了typec代理了usb。只是角度不同所以名字不同罢了。

  • 代理模式 更注重代理,代理了原有类。
  • 装饰器模式 比代理模式更加灵活多样。
  • 适配器模式 更注重兼容性,为了兼容别的类,而不是代理和装饰功能。

虽然角度不同,但是我觉得核心都差不多。这几个设计模式都是需要修改原有类的时候,没有选择修改,而是套了壳子,来扩展功能。这是一种好的思想,灵活运用思想更重要。

代码放在了我的github上面。

设计模式之装饰器模式–各种功能随意扩展

装饰器模式是灵活给原有类装饰新功能。

动态的给对象添加额外职责,就增加功能来说,装饰模式比生成子类更为灵活。

为什么要使用装饰器模式

如果你需要添加一些额外的功能,再不修改原有类的基础上,给原有类套个壳。并且可以套多个壳,我觉得装饰器模式有点像中间件。

比如你现在有一个登录的功能。

你现在需要给登录加一个权限控制。然后还要增加一个登录日志。还要增加登录微信通知。如果修改原有类可能引起未知bug。

可以使用装饰器模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* 装饰器模式
* 装饰器父类
*/
class Decorate {
function __construct($compent) {
$this->compent = $compent;
}

function login() {
$this->compent->login();
}
}

/**
* 装饰器模式
* 权限装饰器
*/
class LoginAuth extends Decorate {
function login() {
dump('判断登录权限');
parent::login();
}
}

/**
* 装饰器模式
* 登录日志装饰器
*/
class LoginLog extends Decorate {
function login() {
parent::login();
dump('记录登录日志');
}
}


/**
* 装饰器模式
* 微信通知装饰器
*/
class LoginWechat extends Decorate {
function login() {
parent::login();
dump('发送微信登录通知');
}
}

下面是原来的登录功能

1
2
3
4
5
6
7
8
9
10
11
/**
* 装饰器模式
* 核心代码
* 登录功能
*/
class login {
function login() {
dump('用户登录');
}
}

原来的客户端直接调用login,只有登录功能。

1
2
$login = new login();
$login->login();

增加了装饰器以后可以把登录功能放入装饰器。

1
2
3
4
5
6
7
8
9
10
11
12
$login = new login;

//使用权限装饰器
$login = new LoginAuth($login);

//使用登录日志装饰器
$login = new LoginLog($login);

//使用微信通知装饰器
$login = new LoginWechat($login);

$login->login();

decorate

还可以任意调换装饰器的位置,可以先发送微信通知在记录登录日志。

1
2
3
4
5
6
7
8
9
10
11
12
13

$login = new login;

//使用微信通知装饰器
$login = new LoginWechat($login);

//使用登录日志装饰器
$login = new LoginLog($login);

//使用权限装饰器
$login = new LoginAuth($login);

$login->login();

decorate

这个模式就非常灵活,可以任意组装自己的装饰,比如购买支付的时候,需要装饰积分发放,账单通知这些。而且每个装饰器的职责单一,方便插拔,如果不需要一个装饰器的时候把这个装饰器去掉就可以了。

代码放在了我的github上面。

设计模式之桥接模式–组合优于继承的体现

桥接模式是灵活运用组合对象而不是继承类来实现功能。

将抽象与实现部分分离,使他们都可以独立变化。

为什么要使用桥接模式

继承这个面向对象的特性使得我们继承父类可以继承父类的功能,在使用多态特性可以自由修改子类,使得我们的设计很好用。

但是继承有一个问题,就是强耦合。继承一个父类代表拥有这个父类的能力,但这个父类的很多能力你可能并不需要。

还有如果继承关系很复杂的时候,使用继承会导致关系复杂到破裂,无法继承。

比如华为手机和小米手机都具有玩游戏,听音乐等功能。按照继承设计就会有下面4个类,如果再实现拍照功能又需要增加2个类。这个继承关系太过复杂。

  • 手机父类

  • 软件父类

  • 华为游戏手机

  • 华为音乐手机

  • 小米游戏手机

  • 小米音乐手机

如果使用组合的方式,只有4个类。

  • 华为手机类
  • 小米手机类
  • 游戏类
  • 音乐类

让这4个类互相组合就可以了。如果增加个拍照,只需要增加拍照类。这就是抽象和实现分离。手机类就是手机类,软件类就是软件类,互相组合实现功能而不是互相继承。

桥接模式可以理解成连接两个部分,比如连接手机和软件两个部分。像一座桥一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 桥接模式
* 桥的一端
* 手机类
*/
abstract class Mobile {
protected $soft;
/**
* 运行手机功能
*/
public abstract function run();

/**
* 设置相应的软件
*/
public function setSoft(Soft $soft) {
$this->soft = $soft;
}

}

/**
* 桥接模式
* 桥的一端
* 软件类
*/
abstract class Soft {

/**
* 运行软件功能
*/
public abstract function run();


}

下面是手机类的具体实现和软件的具体实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

/**
* 桥接模式
* 桥的一端
* 华为手机类
*
*/
class HuaWei extends Mobile {

/**
* 运行手机功能
*/
public function run() {
dump('华为手机');
$this->soft->run();
}

}


/**
* 桥接模式
* 桥的一端
* 小米手机类
*
*/
class XiaoMi extends Mobile {

/**
* 运行手机功能
*/
public function run() {
dump('小米手机');
$this->soft->run();
}

}


/**
* 桥接模式
* 游戏软件类
*/
class Game extends Soft{

/**
* 运行软件功能
*/
public function run() {
dump('玩王者荣耀');
}


}

/**
* 桥接模式
* 音乐软件类
*/
class Music extends Soft{

/**
* 运行软件功能
*/
public function run() {
dump('打开网易云音乐');
}


}

客户端调用根据需要注入不同的软件就可以实现不同的软件功能而不再需要增加新的类来实现。

1
2
3
4
5
6
7

$obj1 = new HuaWei;
$obj1->setSoft(new Game);
$obj1->run();

$obj1->setSoft(new Music);
$obj1->run();

bridge

桥接模式解决了继承过于复杂的问题,体现了组合优于继承的思想。

代码放在了我的github上面。

设计模式之代理模式–代理转发中间层

代理模式是代理原来的类或对象,在不改变原有类或对象的基础上增加新的功能。

为其他对象提供一种代理以控制对这个对象的访问。

为什么要使用原型模式

代理模式最常用的场景比如我们开发的代理中间层,来代理前端的请求,隐藏真正的后端接口。还有很多远程代理,科学上网也属于代理的一种。

还有虚拟代理,比如浏览器的图片会先出现图片框在加载图片,图片框其实就是一个对图片的代理。

安全代理,用来控制真实对象的访问权限,这个也是代理中间层会做到的。

在我们的代码中一般会使用代理模式做一些原有类做不到的事情,对原有类的扩展。

比如打印sql打印日志发送通知这些跟具体业务无关的功能增加。

这也更加符合开闭原则。通过增加代理类的方式来增加功能而不是修改原来的类。

代理模式要求代理类原类都实现同一个接口,也是对接口实现才能实现用代理类来替换原类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

//代理接口,代理类和原类都需要实现这个接口
interface IProxy{
public function proxy();
}

//代理类,实现代理接口,代理原类,客户端访问代理类
class proxy implements IProxy {
private $proxy;

function __construct(IProxy $proxy) {
//把要代理的原类传进来
$this->proxy = $proxy;
}

public function proxy() {
//前置功能

//访问原类
$this->proxy->proxy();

//后置功能

}
}

//原类
class product implements IProxy{
function proxy() {
//原类的功能
}
}

原来没有代理的时候,直接调用原类。

1
2
3
4

$product = new product();
$product->proxy();

有了代理类之后,客户端调用代理类,隐藏原类。

1
2
$proxy = new Proxy(new product());
$proxy->proxy();

其实就是套了一层壳。

代码放在了我的github上面。