- Unity基于VideoPlayer组件发布WebGL播放视频【可播放暂停,有滑动条,脚本贴出】
qq_45912896
webglunity游戏引擎音视频c#
首先搭建UI组件绑定情况:视频放在StreamingAssets文件夹下:最后脚本绑定:FirstFrameImage在视频暂停是显示播放时隐藏,可以做成透明遮罩Length是视频长度,把分钟转化成秒最后上脚本:usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Vide
- Unity 视频播放 VideoPlayer Component
lrh3025
unity
文章目录文档经验:在视频上显示UI控制视频进度文档使用videoplayercomponent可以播放视频文件。比如过场动画,或者在3D对象上播放视频,比如场景中的电视机模型上。支持的格式:MP4,mov,webm,wmv例如下面的截图,在一个球形3D对象的材质贴图上播放视频的效果:MaterialProperty的值自动设置成了GameObject的Renderer的材质的MainTexture
- 记录unity视频选择与播放_IOS&Android
bobcameltom
xcodeandroidstudiounity3d
文章目录前言一、工作背景二、工作步骤1.IOS部分2.Android部分3.导出打包测试总结前言最近需要开发app中的视频播放功能,首先要从系统相册中选择视频,然后将其在app中全屏播放。一、工作背景首先在unity中搭建了一个简单的平台,一个按钮和一个videoplayer物体。videoplayer使用的是unity自带的。在button上挂了一个脚本,用来监听点击动作。通过判断不同的平台类型
- 圣诞节快到了,快给你的女朋友来个圣诞树把
小贺要学前端
cssjavascript前端
还在单身的朋友就不要掺和了(开个玩笑)。代码部分使用服务器形式打开即可。体验地址:圣诞树(mxll.xyz)bendi我想复制圣诞树*{box-sizing:border-box;}body{margin:0;height:100vh;overflow:hidden;display:flex;align-items:center;justify-content:center;background:
- 创建 Node.js Playwright 项目:从零开始搭建自动化测试环境
我名字很好听
node.js
一、环境准备在开始创建Playwright项目之前,确保你的电脑上已经安装了以下工具:Node.js:Playwright依赖于Node.js环境,确保你已经安装了最新版本的Node.js。可以通过以下命令检查是否安装成功:node-vnpm-vVSCode编辑器:虽然你可以使用任何代码编辑器,但VSCode提供了丰富的插件支持,特别是Playwright插件,可以极大提高开发效率。二、通过npm
- 56、如何快速让⼀个盒⼦⽔平垂直居中
qq_45600165
前端-面试题前端
在网页开发中,有多种方式能让一个盒子实现水平垂直居中。下面为你介绍几种常见且快速的方法。1.使用Flexbox布局Flexbox是一种非常便捷的布局模型,能够轻松实现元素的水平和垂直居中。html.parent{display:flex;justify-content:center;align-items:center;width:300px;height:300px;background-col
- jquery插件 Datatables,的 fnDraw()方法怎么使用
混进IT圈
jQuerydatatablejqueryJavaScriptViewUI
jquery插件Datatables,的fnDraw()方法如何使用;http://datatables.net/examples/basic_init/scroll_y_theme.htmlJScriptcodefunctionButton2_onclick(){variCurrentPage=oTable.fnSettings()._iDisplayStart;varoSettings=oTa
- 虚拟机开发环境搭建与内网迁移
无人机长了一个脑袋
无人机
以下是关于在虚拟机中搭建开发环境并迁移至内网的详细步骤及注意事项,适用于需要在内网隔离环境中进行开发的场景(如企业安全要求、离线开发等):一、虚拟机开发环境搭建1.选择虚拟机平台推荐工具:VirtualBox(免费开源,跨平台)VMwareWorkstationPlayer(免费个人版,性能更优)Hyper-V(Windows内置,需系统支持)2.创建虚拟机操作系统选
- Google Play 应用发布清单:Android App 上线完整指南
34号树洞
测试工具物联网android前端人工智能
目录一、GooglePlay管理中心账号和应用设置1.开发者账号准备:2.创建应用:3.应用内商品和订阅(如果适用):二、商店列表(StoreListing)1.应用名称(Title):2.简短说明(ShortDescription):3.完整说明(FullDescription):4.应用图标(AppIcon):5.宣传图片(FeaturedGraphic):6.屏幕截图(Screenshots
- Flip 动画解决方案全解析
前端小巷子
javascript前端
在当今数字产品设计中,动画已成为提升用户体验不可或缺的元素。Flip动画(FirstLastInvertPlay)作为一种高效、流畅的动画技术,正被越来越多的前端开发者和设计师采用。本文将深入探讨Flip动画的原理、优势以及实现方案。什么是Flip动画?Flip动画是一种基于元素初始状态和最终状态差异来创建平滑过渡的技术。其名称来源于四个核心步骤:First:记录元素的初始状态(位置、尺寸等)La
- Android Mainline简介
for_syq
Android系统开发android
关键要点AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性。允许通过GooglePlay系统更新分发模块,无需完整固件更新。能简化厂商工作并减少碎片化,但覆盖范围有限。什么是AndroidMainline?AndroidMainline是Google在Android9(Pie)及以上版本中引入的一个框架,通过将Android系统的关键组件模块化,允许这些组件
- iframe嵌套第三方网址报错
更容易记住我
其他nginxifream
第一种报错描述:Refusedtodisplay‘嵌套的网址’inaframebecauseitset‘X-Frame-Options’to‘sameorigin’.X-Frame-Options:X-Frame-Options是一个HTTP响应头部,用于防止网站被嵌入到其他网站的iframe中。该协议定义了一些选项,使网站可以控制在哪些网站中可以嵌入自己的内容,从而防止网站被点击劫持攻击。X-F
- LeetCode --- 135双周赛
竹下为生
LeetCode周赛leetcode算法职场和发展
题目列表3222.求出硬币游戏的赢家3223.操作后字符串的最短长度3224.使差值相等的最少数组改动次数3225.网格图操作后的最大分数一、求出硬币游戏的赢家简单数学题,115只能由一个75和四个10组成,我们只要看能构成几115就行,如果有奇数个115则Alice赢,否则Bob赢,代码如下classSolution{public:stringlosingPlayer(intx,inty){//
- QChart 画饼图
m0_68739984
c++qt
QtQChartView实现如图AnswerToachievethedesiredpiechartdisplayinQtwithpercentagesshownoneachslice,youneedtocreateaQPieSeries,addslicestoit,calculateanddisplaythepercentageforeachslice,andaddtheseriestoaQCha
- 多语言笔记系列:展示程序执行结果
bicijinlian
PolyglotNotebooks教程笔记windowsjavascript
展示程序执行结果Console.WriteLine()方法,输出字符串到结果区域Console.WriteLine("将字符串输出到展示区!");使用内置的Display()方法//直接写变量:限制是必须是最后一行varstrList=newList(){"ab","cd","ef"};strList//使用Display()方法,可以多次调用。估计是.NetInterActive内容实现的扩展方
- IcePlayer音乐播放器项目分析及学习指南
夔888
我的项目qtc++
IcePlayer音乐播放器项目分析及学习指南项目概述IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用VisualStudio2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。技术栈C++:核心编程语言Qt5框架:GUI开发框架QMediaPlayer:音频播放功能QNetworkAccessManager:网
- 【音视频】VLC播放器
慢一点会很快
音视频音视频媒体
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档一、vlc是什么?VLCMediaPlayer(简称VLC)是一款免费、开源、跨平台的多媒体播放器,由非营利组织VideoLAN开发,最初是法国巴黎中央理工学院学生的项目,现由全球志愿者维护。其核心特点包括支持几乎所有音视频格式、无广告、低资源占用以及强大的扩展功能,被誉为“万能播放器”;VLC有一个理念一切都是流的播放;特点:格式支
- 04-libVLC的视频播放器:获取媒体信息
小gpt&
音视频媒体qtffmpegc++
libvlc_media_t*libvlc_media_player_get_media(libvlc_media_player_t*p_mi);功能说明核心作用:获取与媒体播放器关联的当前媒体对象返回值:成功:返回libvlc_media_t*指针失败/无关联媒体:返回NULL内存管理:返回的媒体对象引用计数会增加,需要使用libvlc_media_release()释放intlibvlc_me
- FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)
小gpt&
ffmpeg音视频qtc++
本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流基于Qt和FFmpeg的视频解码播放器类,继承自QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能工作流程初始化阶段:用户设置URL和显示尺寸调用play()启动线程解码循环:打开媒体流并初始化解码器持续读取视频帧并解码处理帧同步和播放速度控制转换帧格式并发送给显示错误处理:网络中断
- Android模块编译无法找到依赖(shared_libs)
CheungChunChiu
androidjavaapacheaudiospeex重采样嵌入式
增加重采样库(libspeexresampler库)cc_binary{name:"tinyplay",host_supported:true,srcs:["tinyplay.c"],shared_libs:["libtinyalsa","libspeexresampler",],cflags:["-Werror"],target:{darwin:{enabled:false,},},}编译报错日
- flutter 项目的Android 怎么集成第三方
00后程序员张
httpudphttpswebsocket网络安全网络协议tcp/ip
使用Google登录集成Flutter应用我们将使用Google登录来验证应用程序的用户。Google登录功能可让用户使用其Google帐户(与Gmail、Play、照片和其他Google服务所使用的帐户相同的帐户)进行安全登录。我们还可以根据与用户的Google帐户相关联的个人资料和身份信息,个性化用户体验。用户登录后,我们可以使用个人资料照片个性化聊天消息头像。要添加对Google登录的支持,
- 利用纯JS开发浏览器小窗口移动广告小功能
T-shmily
javascriptjavascript
效果展示直接上代码如果要用到vue项目里面,直接按照vue的写法改动就行,一般没有多大的问题,顶部的占位是我项目需求,你可以按照要求改动。*{margin:0;box-sizing:border-box;}.zhanwei{width:100%;height:160px;border:1pxsolidred;}#thediv{width:137px;height:177px;display:fle
- TCPDF不显示带有writeHTML的图像
明天依旧下着大雨
PHPTCPDFPDF生成图像显示HTML转PDFPHP库
$html='';img标签需要是双引号https://stackoverflow.com/questions/13702891/tcpdf-dont-display-image-with-writehtml
- html中button点击效果简单,css动画-实现一个最简单的水波纹效果button
weixin_39559119
类似material-ui的button效果步骤1.在页面写出一个button并赋予简单的样式代码这是一个按钮button{display:block;/*button默认是inline-block无法用margin给它居中*/margin:50pxauto;height:60px;width:150px;color:#FFF;font-size:16px;background:#E95546;o
- CSS——按钮加点击特效
Bonsoir777
css前端vue.js前端框架javascript面试
一、实现效果二、实现过程Document.box{margin:100px00200px;}.button{cursor:pointer;width:184px;height:48px;display:flex;align-items:center;justify-content:center;gap:1rem;font-size:1.125em;font-weight:800;letter-sp
- css button 点击效果
梦雨生生
csscssjavascriptcss3
button点击效果#container{display:flex;align-items:center;justify-content:center;}.pushable{position:relative;background:transparent;padding:0px;border:none;cursor:pointer;outline-offset:4px;outline-color:
- pdfjs库使用2
java_jun
javascript前端css
.pdf-viewer{display:flex;flex-direction:column;align-items:center;width:100%;height:100%;}.pdf-controls{display:flex;gap:1rem;margin:1rem0;align-items:center;}.pdf-container{width:100%;overflow:auto;-
- C#学习第16天:聊聊反射
ghost143
C#学习30天计划学习c#开发语言
什么是反射?定义:反射是一种机制,允许程序在运行时获取关于自身的信息,并且可以动态调用方法、访问属性或创建实例。用途:常用于框架设计、工具开发、序列化、代码分析和测试等场景反射的核心概念1.获取类型信息通过System.Type类,可以获取类型的完整信息。usingSystem;publicclassExample{publicvoidDisplay(){Console.WriteLine("Di
- python request库 超时_Python请求库超时,但从浏览器获取响应
旋风1968
pythonrequest库超时
我正在尝试为nba数据创建一个webscrapper.当我运行以下代码时:importrequestsresponse=requests.get('https://stats.nba.com/stats/leaguedashplayerstats?College=&Conference=&Country=&DateFrom=10%2F20%2F2017&DateTo=10%2F20%2F2017&
- Godot引擎开发:UI和用户交互_动画与过渡效果
chenlz2007
游戏开发godotui交互游戏引擎nginx
动画与过渡效果在上一节中,我们探讨了如何在Godot引擎中创建和管理UI元素。接下来,我们将深入探讨如何为UI元素添加动画和过渡效果,以提升用户体验和视觉效果。动画和过渡效果可以使得UI更加生动和吸引人,同时也可以帮助用户更好地理解界面的变化和状态。1.基本动画原理在Godot引擎中,动画可以通过多种方式进行实现,包括使用AnimationPlayer节点、脚本控制和信号驱动。AnimationP
- Enum 枚举
120153216
enum枚举
原文地址:http://www.cnblogs.com/Kavlez/p/4268601.html Enumeration
于Java 1.5增加的enum type...enum type是由一组固定的常量组成的类型,比如四个季节、扑克花色。在出现enum type之前,通常用一组int常量表示枚举类型。比如这样:
public static final int APPLE_FUJI = 0
- Java8简明教程
bijian1013
javajdk1.8
Java 8已于2014年3月18日正式发布了,新版本带来了诸多改进,包括Lambda表达式、Streams、日期时间API等等。本文就带你领略Java 8的全新特性。
一.允许在接口中有默认方法实现
Java 8 允许我们使用default关键字,为接口声明添
- Oracle表维护 快速备份删除数据
cuisuqiang
oracle索引快速备份删除
我知道oracle表分区,不过那是数据库设计阶段的事情,目前是远水解不了近渴。
当前的数据库表,要求保留一个月数据,且表存在大量录入更新,不存在程序删除。
为了解决频繁查询和更新的瓶颈,我在oracle内根据需要创建了索引。但是随着数据量的增加,一个半月数据就要超千万,此时就算有索引,对高并发的查询和更新来说,让然有所拖累。
为了解决这个问题,我一般一个月会进行一次数据库维护,主要工作就是备
- java多态内存分析
麦田的设计者
java内存分析多态原理接口和抽象类
“ 时针如果可以回头,熟悉那张脸,重温嬉戏这乐园,墙壁的松脱涂鸦已经褪色才明白存在的价值归于记忆。街角小店尚存在吗?这大时代会不会牵挂,过去现在花开怎么会等待。
但有种意外不管痛不痛都有伤害,光阴远远离开,那笑声徘徊与脑海。但这一秒可笑不再可爱,当天心
- Xshell实现Windows上传文件到Linux主机
被触发
windows
经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下;之前我的做法现在看来好笨好繁琐,不过也达到了目的,笨人有本方法嘛;
我是怎么操作的:
1、打开一台本地Linux虚拟机,使用mount 挂载Windows的共享文件夹到Linux上,然后拷贝数据到Linux虚拟机里面;(经常第一步都不顺利,无法挂载Windo
- 类的加载ClassLoader
肆无忌惮_
ClassLoader
类加载器ClassLoader是用来将java的类加载到虚拟机中,类加载器负责读取class字节文件到内存中,并将它转为Class的对象(类对象),通过此实例的 newInstance()方法就可以创建出该类的一个对象。
其中重要的方法为findClass(String name)。
如何写一个自己的类加载器呢?
首先写一个便于测试的类Student
- html5写的玫瑰花
知了ing
html5
<html>
<head>
<title>I Love You!</title>
<meta charset="utf-8" />
</head>
<body>
<canvas id="c"></canvas>
- google的ConcurrentLinkedHashmap源代码解析
矮蛋蛋
LRU
原文地址:
http://janeky.iteye.com/blog/1534352
简述
ConcurrentLinkedHashMap 是google团队提供的一个容器。它有什么用呢?其实它本身是对
ConcurrentHashMap的封装,可以用来实现一个基于LRU策略的缓存。详细介绍可以参见
http://code.google.com/p/concurrentlinke
- webservice获取访问服务的ip地址
alleni123
webservice
1. 首先注入javax.xml.ws.WebServiceContext,
@Resource
private WebServiceContext context;
2. 在方法中获取交换请求的对象。
javax.xml.ws.handler.MessageContext mc=context.getMessageContext();
com.sun.net.http
- 菜鸟的java基础提升之道——————>是否值得拥有
百合不是茶
1,c++,java是面向对象编程的语言,将万事万物都看成是对象;java做一件事情关注的是人物,java是c++继承过来的,java没有直接更改地址的权限但是可以通过引用来传值操作地址,java也没有c++中繁琐的操作,java以其优越的可移植型,平台的安全型,高效性赢得了广泛的认同,全世界越来越多的人去学习java,我也是其中的一员
java组成:
- 通过修改Linux服务自动启动指定应用程序
bijian1013
linux
Linux中修改系统服务的命令是chkconfig (check config),命令的详细解释如下: chkconfig
功能说明:检查,设置系统的各种服务。
语 法:chkconfig [ -- add][ -- del][ -- list][系统服务] 或 chkconfig [ -- level <</SPAN>
- spring拦截器的一个简单实例
bijian1013
javaspring拦截器Interceptor
Purview接口
package aop;
public interface Purview {
void checkLogin();
}
Purview接口的实现类PurviesImpl.java
package aop;
public class PurviewImpl implements Purview {
public void check
- [Velocity二]自定义Velocity指令
bit1129
velocity
什么是Velocity指令
在Velocity中,#set,#if, #foreach, #elseif, #parse等,以#开头的称之为指令,Velocity内置的这些指令可以用来做赋值,条件判断,循环控制等脚本语言必备的逻辑控制等语句,Velocity的指令是可扩展的,即用户可以根据实际的需要自定义Velocity指令
自定义指令(Directive)的一般步骤
&nbs
- 【Hive十】Programming Hive学习笔记
bit1129
programming
第二章 Getting Started
1.Hive最大的局限性是什么?一是不支持行级别的增删改(insert, delete, update)二是查询性能非常差(基于Hadoop MapReduce),不适合延迟小的交互式任务三是不支持事务2. Hive MetaStore是干什么的?Hive persists table schemas and other system metadata.
- nginx有选择性进行限制
ronin47
nginx 动静 限制
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;...
server {...
location ~.*\.(gif|png|css|js|icon)$ {
- java-4.-在二元树中找出和为某一值的所有路径 .
bylijinnan
java
/*
* 0.use a TwoWayLinkedList to store the path.when the node can't be path,you should/can delete it.
* 1.curSum==exceptedSum:if the lastNode is TreeNode,printPath();delete the node otherwise
- Netty学习笔记
bylijinnan
javanetty
本文是阅读以下两篇文章时:
http://seeallhearall.blogspot.com/2012/05/netty-tutorial-part-1-introduction-to.html
http://seeallhearall.blogspot.com/2012/06/netty-tutorial-part-15-on-channel.html
我的一些笔记
===
- js获取项目路径
cngolon
js
//js获取项目根路径,如: http://localhost:8083/uimcardprj
function getRootPath(){
//获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jsp
var curWwwPath=window.document.locati
- oracle 的性能优化
cuishikuan
oracleSQL Server
在网上搜索了一些Oracle性能优化的文章,为了更加深层次的巩固[边写边记],也为了可以随时查看,所以发表这篇文章。
1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。(这点本人曾经做过实例验证过,的确如此哦!
- Shell变量和数组使用详解
daizj
linuxshell变量数组
Shell 变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="w3cschool.cc"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用ba
- 编程中的一些概念,KISS、DRY、MVC、OOP、REST
dcj3sjt126com
REST
KISS、DRY、MVC、OOP、REST (1)KISS是指Keep It Simple,Stupid(摘自wikipedia),指设计时要坚持简约原则,避免不必要的复杂化。 (2)DRY是指Don't Repeat Yourself(摘自wikipedia),特指在程序设计以及计算中避免重复代码,因为这样会降低灵活性、简洁性,并且可能导致代码之间的矛盾。 (3)OOP 即Object-Orie
- [Android]设置Activity为全屏显示的两种方法
dcj3sjt126com
Activity
1. 方法1:AndroidManifest.xml 里,Activity的 android:theme 指定为" @android:style/Theme.NoTitleBar.Fullscreen" 示例: <application
- solrcloud 部署方式比较
eksliang
solrCloud
solrcloud 的部署其实有两种方式可选,那么我们在实践开发中应该怎样选择呢? 第一种:当启动solr服务器时,内嵌的启动一个Zookeeper服务器,然后将这些内嵌的Zookeeper服务器组成一个集群。 第二种:将Zookeeper服务器独立的配置一个集群,然后将solr交给Zookeeper进行管理
谈谈第一种:每启动一个solr服务器就内嵌的启动一个Zoo
- Java synchronized关键字详解
gqdy365
synchronized
转载自:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。
同步机制可以使用synchronized关键字实现。
当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。
当s
- js实现登录时记住用户名
hw1287789687
记住我记住密码cookie记住用户名记住账号
在页面中如何获取cookie值呢?
如果是JSP的话,可以通过servlet的对象request 获取cookie,可以
参考:http://hw1287789687.iteye.com/blog/2050040
如果要求登录页面是html呢?html页面中如何获取cookie呢?
直接上代码了
页面:loginInput.html
代码:
<!DOCTYPE html PUB
- 开发者必备的 Chrome 扩展
justjavac
chrome
Firebug:不用多介绍了吧https://chrome.google.com/webstore/detail/bmagokdooijbeehmkpknfglimnifench
ChromeSnifferPlus:Chrome 探测器,可以探测正在使用的开源软件或者 js 类库https://chrome.google.com/webstore/detail/chrome-sniffer-pl
- 算法机试题
李亚飞
java算法机试题
在面试机试时,遇到一个算法题,当时没能写出来,最后是同学帮忙解决的。
这道题大致意思是:输入一个数,比如4,。这时会输出:
&n
- 正确配置Linux系统ulimit值
字符串
ulimit
在Linux下面部 署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用 其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。因为这个问题是我配置Nginx+php5时遇到了,所以我将这篇归纳进
- hibernate调用返回游标的存储过程
Supanccy2013
javaDAOoracleHibernatejdbc
注:原创作品,转载请注明出处。
上篇博文介绍的是hibernate调用返回单值的存储过程,本片博文说的是hibernate调用返回游标的存储过程。
此此扁博文的存储过程的功能相当于是jdbc调用select 的作用。
1,创建oracle中的包,并在该包中创建的游标类型。
---创建oracle的程
- Spring 4.2新特性-更简单的Application Event
wiselyman
application
1.1 Application Event
Spring 4.1的写法请参考10点睛Spring4.1-Application Event
请对比10点睛Spring4.1-Application Event
使用一个@EventListener取代了实现ApplicationListener接口,使耦合度降低;
1.2 示例
包依赖
<p