unity3d架构架构有哪些层

三层架构(我的理解及详细分析)
我的图书馆
三层架构(我的理解及详细分析)
三层已经学了一段时间,一直想做一个比较完整、比较完美的总结。但是左思右想,不知道如何下笔。都说万事开头难嘛,今天整理了一下凌乱的思路,哎,还是没整理好,想到哪就说到哪吧。
初学者很不理解:
1,什么是三层?
2,为什么使用三层?
3,三层与以往使用的两层相比有什么不同?它的优势在哪里?
4,如何学好三层?如何应用三层?
这篇博客里我会给大家一一解释一下,略懂皮毛忘大家见谅!!!
米老师一直强调:让学习和生活结合,把学习和生活联系,这样的学习才叫会学习,会生活。
对于三层我左思右想,如何与实际相联系。好嘛,昨晚突然有了“灵感”。还记得大话设计模式里第23章大鸟和小菜吃羊肉串的故事——由在小摊吃到饭店吃引来的一个命令模式(当然今天不是研究命令模式)。服务员、厨师、采购员。
这不就是个典型的三层架构吗???(⊙ o
⊙ )啊!哈哈(这个后面再做解释)
1,什么是三层?
UI(表现层):主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
BLL:(业务逻辑层):UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
DAL:(数据访问层):与打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)
每一层都各负其责,那么该如何将三层联系起来呢?
1&单项引用(见下图)
2&这时候实体层(Entity)来了。(注:当然,实体层的作用不止这些)
Entity(实体层):它不属于三层中的任何一层,但是它是必不可少的一层。
Entity在三层架构中的作用:
1,实现面向对象思想中的"封装";
2,贯穿于三层,在三层之间传递数据;
(注:确切的说实体层贯穿于三层之间,来连接三层)
3,对于初学者来说,可以这样理解:每张数据表对应一个实体,即每个数据表中的字段对应实体中的属性(注:当然,事实上不是这样。为什么?1>,可能我们需要的实体在数据表对应的实体中并不存在;2>,我们完全可以将所有数据表中的所有字段都放在一个实体里)
4,每一层(UI—&BLL—&DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。
但是对于大量的数据来说,用变量做参数有些复杂,因为参数量太多,容易搞混。比如:我要把员工信息传递到下层,信息包括:员工号、姓名、年龄、性别、工资....用变量做参数的话,那么我们的方法中的参数就会很多,极有可能在使用时,将参数匹配搞混。这时候,如果用实体做参数,就会很方便,不用考虑参数匹配的问题,用到实体中哪个属性拿来直接用就可以,很方便。这样做也提高了效率。
(注:这里为什么说可以暂时理解为每个数据表对应一个实体??答:大家都知道,我们做系统的目的,是为用户提供服务,用户可不关心你的系统后台是怎么工作的,用户只关心软件是不是好用,界面是不是符合自己心意。用户在界面上轻松的增、删、改、查,那么数据库中也要有相应的增、删、改、查,而增删改查具体操作对象就是数据库中的数据,说白了就是表中的字段。所以,将每个数据表作为一个实体类,实体类封装的属性对应到表中的字段,这样的话,实体在贯穿于三层之间时,就可以实现增删改查数据了)
综上所述:三层及实体层之间的依赖关系:
思想来源于生活:
服务员:只管接待客人;
厨师:只管做客人点的菜;
采购员:只管按客人点菜的要求采购食材;
他们各负其职,服务员不用了解厨师如何做菜,不用了解采购员如何采购食材;厨师不用知道服务员接待了哪位客人,不用知道采购员如何采购食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨师如何做菜。
他们三者是如何联系的?
比如:厨师会做:炒茄子、炒鸡蛋、炒面——此时构建三个方法( cookEggplant()、cookEgg()、cookNoodle())
顾客直接和服务员打交道,顾客和服务员(UI层)说:我要一个炒茄子,而服务员不负责炒茄子,她就把请求往上递交,传递给厨师(BLL层),厨师需要茄子,就把请求往上递交,传递给采购员(DAL层),采购员从仓库里取来茄子传回给厨师,厨师响应cookEggplant()方法,做好炒茄子后,又传回给服务员,服务员把茄子呈现给顾客。
这样就完成了一个完整的操作。
在此过程中,茄子作为参数在三层中传递,如果顾客点炒鸡蛋,则鸡蛋作为参数(这是变量做参数)。如果,用户增加需求,我们还得在方法中添加参数,一个方法添加一个,一个方法设计到三层;何况实际中并不止设计到一个方法的更改。所以,为了解决这个问题,我们可以把茄子、鸡蛋、面条作为属性定义到顾客实体中,一旦顾客增加了炒鸡蛋需求,直接把鸡蛋属性拿出来用即可,不用再去考虑去每层的方法中添加参数了,更不用考虑参数的匹配问题。
这样讲,不知道大家是不是可以明白。(待会实例解释吧)
2,为什么使用三层?
使用三层架构的目的:解耦!!!
同样拿上面饭店的例子来讲:
(1)服务员(UI层)请假——另找服务员;厨师(BLL层)辞职——招聘另一个厨师;采购员(DAL)辞职——招聘另一个采购员;
(2)顾客反映:1&你们店服务态度不好——服务员的问题。开除服务员;
2&你们店菜里有虫子——厨师的问题。换厨师;
任何一层发生变化都不会影响到另外一层!!!
3,与两层的区别??
(当任何一个地方发生变化时,都需要重新开发整个系统。“多层”放在一层,分工不明确耦合度高——难以适应需求变化,可维护性低、可扩展性低)
(发生在哪一层的变化,只需更改该层,不需要更改整个系统。层次清晰,分工明确,每层之间耦合度低——提高了效率,适应需求变化,可维护性高,可扩展性高)
综上:三层架构的
优势:1,结构清晰、耦合度低,2,可维护性高,可扩展性高;3,利于开发任务同步进行;容易适应需求变化
劣势:1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码
3、增加了代码量,增加了工作量
4,三层的具体表现形式??
(大家不要误会,UI层不只是一个个用户界面,也是需要有代码的)
(1,功能:用户输入数据、反馈给用户数据;2,大家观察代码:没有涉及到业务逻辑,直接传参、函数、方法调用,没有涉及到与数据库打交道的SQL语句和ADO.net)
(1,BLL是表示层与数据访问层之间的桥梁,负责数据处理、传递;2,大家观察代码,没有涉及到界面上的控件,没有涉及到SQL语句和ADO.net)
(1,以上是DAL层中DbUtil类、user_DA类和workRecord_DA类中的代码;2,大家观察代码,没有涉及到界面控件,没有涉及到业务逻辑;只有与数据库打交道的SQL语句和ADO.net)
Entity(Model)层:
(定义了实体类user)
观察以上三层:
1,实体类user作为参数贯穿于三层之间;
2,通过传参、方法调用来实现功能;
3,各层之间各负其责;互不影响
对比两层结构,让大家深刻体会三层的极大好处:
还是以机房收费系统的登陆为例:
(观察上面的两层的代码:将业务逻辑、数据访问都展现在用户表现层,当需求需要改变时,需要改变整个系统。比如,我把文本框txtPassWord的名称改为txtPwd的话,大家观察一下得需要更改多少地方。这样的改动算是小的,如果真的有业务需求上的改动才叫麻烦复杂,程序员不跳楼才怪。呵呵、、开个玩笑)
与如此难以适应需求变化的两层相比,大家再次观察三层代码,再次思考,三层架构有什么好处呢?自己思考。。。。。
自己去发掘吧!!!
[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢&>&Formview Unity和LINQ实现的3层架构
Formview Unity和LINQ实现的3层架构
上传大小:900KB
使用FormView Unity和LINQ实现的3层架构----MasterDataManage模型
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有1条
感谢,非常好的实例,对三层架构有了更深入的理解
VIP会员动态
热门资源标签
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
Formview Unity和LINQ实现的3层架构
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
dujingjing1230
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
Formview Unity和LINQ实现的3层架构如何在三层架构中使用Unity IOC?
[问题点数:40分,结帖人hbydsg]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:173887
2015年9月 总版技术专家分月排行榜第一2015年8月 总版技术专家分月排行榜第一2015年7月 总版技术专家分月排行榜第一2015年6月 总版技术专家分月排行榜第一2015年5月 总版技术专家分月排行榜第一2015年4月 总版技术专家分月排行榜第一
2016年1月 总版技术专家分月排行榜第二2015年11月 总版技术专家分月排行榜第二2015年10月 总版技术专家分月排行榜第二
优秀小版主
2016年3月 总版技术专家分月排行榜第三
本版专家分:0
匿名用户不能发表回复!
其他相关推荐
DBCP配置:
&bean id=&dataSource&
class=&org.apache.commons.dbcp.BasicDataSource& destroy-method=&close&&
C3P0配置:
&bean id=&dataSource&
class=&com.mchange.v2.c3p
[IoC容器Unity]第一回:Unity预览
高内聚,低耦合成为一个OO架构设计的一个参考标准。高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单。
拿咱国家举例来说,假如你是中国人。
高内聚:就是说你跟中国亲,关系好,国家会保护你。
低内聚:就是说你跟中国的关系不好,那还怎么混,改天就要批斗你,你就是个问题源。
原文地址:http://www.cnblogs.com/wujy/p/3317795.html
框架解释:
WCF 用来对我的应用提供业务处理
Entity Framework 作为 WCF 服务层的数据访问
在Entity Framework 中,我们会使用UnitOfWork 来做为事务控制
我们利用IOC构造创建我们的 DBContext ,保证 CRUD中的DBContext 和 UnitOfWork中的 DBContext 是同一个实例
然后用AOP实现业务层的切面编
我之前写的文章一般都有通过Autofac来实现IoC,这次我来换一个框架,体会一下ASP.NET
mvc5 采用Unity依赖注入Controller。此之前说说一下Unity框架。
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入(Construc
介绍一个插件Loom可以让你在Unity使用多线程处理UnityEngine的逻辑(包含Unity的API)。
Unity中的线程不能使用Unity的对象,但可以使用Unity的值类型变量,如Vector3等。这样就使得线程在Unity中显的很鸡肋和蹩脚,因为很多函数很都是UnityEngine类或函数的调用的,对于哪些是可以在多线程使用,如下总结:
学习Sping的一些问题总结
SpringBeanAOP配置管理IOC
如何在spring中实现国际化
spring的组成部分
【狗刨学习网】
Unity是微软P&P推出的一个开源的IoC框架,最新的官方版本是2.0。Unity之前的版本建立在一个称为ObjectBuild的组件上,熟悉EnterLib的读者,相信对ObjectBuild不会感到陌生。对于EnterLib
5.0之前的版本,ObjectBuild可以说是所有Application Block的基石。ObjectBuild提供一种扩展、可定
新建项目步骤操作
下面图中【图表 0-1】是(创建项目方法步骤2)的操作新建(WCF客户端Client)项目流程;
1)创建新项目方法步骤1:
是打开下图中1处(文件(F))这个选项,然后鼠标移动到新建这一位置,鼠标再移动到项目选择进去。出现新建项目窗口,选择Visual C#中的Windows功能模块,选中Windows功能;右边出现Windows窗体应用程序,选中Windows窗体应用程
public IList GetPage(CustomerSearchVO vo, int pageIndex, int pageSize, out int totalCount)
IList list = new List();
Customer customer =谁有Unity3D的类结构图
如题: 我想要结构图要是全有就最好部分也要
要评论请先&或者&
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('http://www.ceeger.com/forum/attachment/Mon_9_ba082b.jpg');" />
灰常感谢有没有类继承关系的结构图 或者哪里可以找得到
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('http://www.ceeger.com/forum/attachment/Mon_9_cace9c78fe9471e.jpg');" />
726 || this.offsetHeight>700){if(this.offsetWidth/726 > this.offsetHeight/700){this.width=726;}else{this.height=700;}}" style="max-width:726max-height:700" title="点击查看原图" onclick="if(this.parentNode.tagName!='A') window.open('http://www.ceeger.com/forum/attachment/Mon_9_debe.png');" />
灰常感谢两位大虾
这个必须顶起来刚开始学习Unity编程时,感觉非常的不习惯。一直以来,我都是使用基于类的面向对象编程,当转到Unity开发后,发现所有的代码都是拖到一个个组件上面去的,早已习惯了的mvc,mvp等架构思想在Unity上却不太适用了。
所以在我前期开发Unity时,完全是没有架构可言的,每次都是某个组件需要什么功能,我就把相应的功能代码托上去,可是写到后面,我发现整个项目的逻辑越来越混乱,各种组件在代码中互相引用,修改某一个组件上的代码就会导致其他组件的修改。后来当我慢慢了熟悉Unity的开发,熟悉了这种基于组件的编程思想后,开始慢慢的组织自己的代码逻辑和项目架构。所以在这里,我将我这段时间对于U3D项目架构的总结记录下来。
一 文件目录架构
Unity官方文档介绍的文件目录架构如下
Assets:主文件夹,包含所有工程需要用到的资源。
Editor:所有在Editor和它的子文件夹的脚本,都不会作为运行期脚本被编译,而是作为动态添加Unity编译器功能的脚本来编译。在该文件夹和其子文件夹的脚本不能被添加到GameObject上。
Editor Default Resources:必须作为Assets的子文件夹,作为Editor脚本的资源使用,通过函数EditorGUIUtility.Load来使用。
Gizmos:场景面板中的图标图片资源,使用Gizmos.DrawIcon 函数在场景面板新建图标,图标的图片资源必须位于这个文件夹内。(比如Unity的各种插件)
Plugins:所有的插件资源,包括用C/C++编写的Dll库。
Resources:一般用来存放需要通过代码初始化使用的资源,可以放在工程中的任意文件夹中,在Resources文件夹中的文件可以通过Resources.Load 来读取。方式如下。
rend.material.mainTexture = Resources.Load(“glass”) as T
GameObject instance = Instantiate(Resources.Load(“enemy”,typeof(GameObject))) as GameO
Standard Assets:导入标准材质包时新建的,拥有自己的编译顺序。
StreamingAssets:通过Application.streamingAssetsPath 获取目录路径,该目录中的文件将会原封不动的被拷贝到不同的平台上,每个平台对应的目录不一致,但是都可以通过上述方法获得。一般用来存放视频等资源文件。
Hidden Assets:一般用来存放README以及一些操作系统生成的临时文件,这些文件/文件夹一般以. ~ 或者名为cvs 或者扩展名是tmp 。
二 代码组织架构
①小型项目
开发小型项目时,不需要太复杂的架构方式,直接将逻辑脚本拖到响应的控件即可,但是这个时候有一个点需要考虑的就是脚本内的代码会随着逻辑的增加而越来越多,所以,这个时候最好的做法是将脚本拆分成几个脚本,每个脚本处理相应的逻辑业务,然后全部添加到组件上去。
我们以做一个飞机大战的小游戏举例,飞机有前后左右飞行的逻辑,有发射子弹的逻辑,有被击中的逻辑……我们可以把这些逻辑分别写在不同的脚本上,然后挂载到飞机上,而不是将所有的逻辑放在一个脚本内。这样我们对飞机的各个逻辑业务会更加的清晰,也更好控制。
②中小型项目
当项目越来越大时,通过拆分代码逻辑的方法已经不够用了,所以这个时候需要用统一的Manager来管理业务逻辑。在一个中型项目中,一般需要需要Level Manager,Pool Manager和Save Manager这三个管理类。下面我来说说这三个Manager的作用
Level Manager
当游戏的关卡比较多时,利用Application.LoadLevel()方法加载关卡已经比较繁琐了,这个时候需要一个Level Manager来专门管理需要加载的关卡,并可以在里面配置加载策略,方便的更改加载关卡的顺序,方式等。
Pool Manager
游戏中经常出现来频繁创建,销毁的物体,比如怪物,子弹等,如果频繁GameObject.Instantiate()来创建,用Deatory()方法来销毁会占用大量内存,引起GC,这个时候就需要一个Pool Manager来统一生成,缓存,或者销毁这些对象。
我们来看看PoolManager的用法
  Private List&GameObject & dormantObjects =new List&GameObject&()
  public GameObject Spawn(GameObject go)
  public void Despawn(GameObject go)
go.transform.parent = PoolManager.
go.SetActive(false);
dormantObject.Add(go);
  public void Trim()
while (dormantObjects.Count & Capacity)
GameObject dob = dormantObjects[0];
dormantObjects.RemoveAt(0);
Destroy(dob);
我们可以看到,PoolManager的作用就是将我们需要频繁创建和销毁的预制体放在一个list中,当容器满了之后,删除最底层使用频度最少的预制体。dormantObjects可以有很多个,用来分别存放不同的物体。
Save Manager
Save Manager可以专门用来存储和加载游戏,通过将数据序列化(Serialize)以二进制的形式保存下来,会让游戏加载的更快。
③大型项目
在大型的项目中,上面三个Manager已经不够用,这个时候我们需要更多的Manager来进行统一管理。
可以看到,一个项目中有一个MainManager来统一管理不同的子Manager。子Manager中又有EventManager对事件进行管理,AduioManager对音效进行管理等等。
在比较大的项目中,虽然设置了很多Manager来进行统一管理,但是项目的结构还是会越来越混乱。所以这个时候我们可以采用MVCS的模式。这种设计思想我是从StrangeIOC这款Unity插件中学来的。MVCS就是在MVC的基础上加了一层Service。我们来看看这种设计思想。
这种的设计模式的业务流程是这样的
玩家点击了一下UI
VIEW中的mediator得到通知(回调),因为它绑定了UI事件
mediator触发了一次CONTROLLER中command执行指令,因为mediator和command进行了绑定
command执行自己的execute方法
请求Service从一个文件中读取数据
当然,MVCS的设计模式只是我们设计架构时参考的一种思路。大型Unity项目开发的经验我也不是很足,等以后有了更多的经验之后,我会继续补充Unity的架构知识。
Unity3D用MVC框架思想实现的小例子
[Unity3D热更框架] LuaMVC简介
《炉石传说》架构设计赏析(1):游戏启动流程
Unity的架构
unity3d基本的C#程序框架
Unity3D 搭建优雅的UI框架
Unity项目架构设计与开发管理
Unity3D自学笔记——架构应用(一)用户登录
Unity3d 引擎原理详细介绍
没有更多推荐了,}

我要回帖

更多关于 unity和虚幻4自学难度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信