.NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)
概述抽象工厂模式(AbstractFactory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。定义抽象工厂模式(AbstractFactory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。UML图解AbstractFactory:声明一个创建抽象产品对象的操作接口ConcreteFactory:实现创建具体产品对象的操作AbstractProduct:声明一类产品对象接口Product定义一个被相应具体工厂创建的产品对象实现AbstractProduct接口Client:使用AbstractFactory和AbstractProduct类声明的接口在抽象工厂模式中,产品的创建由ConcreteFactory来完成,从结构图中可以看出,抽象工厂模式的ConcreteFactory不是负责一种具体Product
Xamarin-Forms-Labs RadioButton控件使用
今天以RadioButton控件为例,介绍下Xamarin-Forms-Labs如何在我们项目中使用XLabsisaopensourceprojectthataimstoprovideapowerfulandcrossplatformsetofservicesandcontrolstailoredtoworkwithXamarinandXamarinForms.XLabs是一个开源的项目,为Xamarin提供了跨平台的服务和控件。XLabs的GitHub地址为https://github.com/forrest23/Xamarin-Forms-Labs将项目download到本地,用XamarinStudio打开项目文件XLabs.sln,然后编译,编译成功后在build文件中会有很多dll文件。在你项目中新建一个文件夹,将dll拷贝过去。然后在你的主项目、IOS项目、安卓项目中分别添加这几个dll的引用。新建一个Forms,类型选择ContentPageXaml在xaml布局
.NET AOP微型框架发布 --CleanAOP
CleanAOP--简介作者:立地(欧文)邮箱:jarvin_g@126.com微博:立地J导语:AOP为AspectOrientedProgramming的缩写。意为:面向切面编程。将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。一:认识Aop在日常的编程任务中,很多的代码都是进行一些通用的功能(日志、检测、一层处理等等),然后代码都是机械般的复制粘贴,实际上的业务逻辑代码只占不多的份额。那么,aop能更好的组织通用的代码、然后以标记的方式让某个方法切入,使得业务逻辑和通用代码分离,使其互不影响。使用Aop的优点容易扩展新的切面。业务逻辑与切面逻辑解耦合。对修改封闭、对扩展开放。使用Aop的缺点对于一些已存在修饰符的方法无法使用,需添加外围方法包含。CleanAop支持语言版本历史最新版本:v2.0.0v1.0.0:框架搭建完成、支持同步异步、提供Dem
一个App完成入门篇(一)-从Hello world开始
程序员学习新技术都是通过HelloWorld开始的,我们也不例外。第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是:开发环境搭建创建开发者账号新建项目拖拽一个组件修改js代码手机查看效果开发环境搭建do平台的开发的基本开发工作都是围绕DeviceOne提供的IDE(DevinceOneStduio),我们通常简称为设计器。设计器是基于Eclipse核心的RCP,熟悉Eclipse的的开发人员应该很熟悉基本的操作。设计器是跨平台的,可以在Windows,Mac下运行。以后可以支持更多,比如Linux。基本的运行条件是需要JavaDevelopmentKit(JDK7)及以上版本。下载页面是这里支持操作系统设计器下载JDK版本大小Windows32位32位Windows版本32位JDK7及以上版本ForWindows140M左右Windows64位64位Windows版本64位JDK7及以上版本ForWindows14
细说C#:委托的简化语法,聊聊匿名方法和闭包(上)
0x00前言通过之前博客《匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的》的内容,我们实现了使用委托来构建我们自己的消息系统的过程。但是在日常的开发中,仍然有很多开发者因为这样或那样的原因而选择疏远委托,而其中最常见的一个原因便是因为委托的语法奇怪而对委托产生抗拒感。因而本文的主要目标便是介绍一些委托的简化语法,为有这种心态的开发者们减轻对委托的抗拒心理。0x01不必构造委托对象委托的一种常见的使用方式,就像下面的这行代码一样:this.unit.OnSubHp+=newBaseUnit.SubHpHandler(this.OnSubHp);其中括号中的OnSubHp是方法,该方法的定义如下:privatevoidOnSubHp(BaseUnitsource,floatsubHp,DamageTypedamageType,HpShowTypeshowType){stringunitName=string.Empty;stringmissS
Datatables 在asp.net mvc中的使用
前言最近使用ABP(ASP.NETBoilerplate)做新项目,以前都是自己扩展一个HtmlHelper来完成同步/异步分页,但是有个地方一直不满意,排序太费劲。以前接触过一点点的Datatables,知道它的排序非常方便,点击表头即可排序,还支持多列排序,然后就把Datatables集成到项目里了。Datatables简介Datatables(以下简称dt)是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。点击进入Datatables中文网分页,即时搜索和排序几乎支持任何数据源:DOM,javascript,Ajax和服务器处理支持不同主题DataTables,jQueryUI,Bootstrap,Foundation各式各样的扩展:Editor,TableTools,FixedColumns……丰富多样的option和强大的API支持国际化超过2900+个单元测试免费开源(MITlicense)!更多特性请到Datatables中文
Asp.Net Web Api 2 实现多文件打包并下载文件示例源码
前言最近由于工作和个人事务,站点也好久没更新了,但这并不影响我对.NET的热情。站点的更新工作还是得想办法抽时间来完成的。提要今天利用中午的时间来写一篇关于Asp.NetWebApi下载文件的文章,之前我也写过类似的文章,请见:《ASP.NET(C#)WebApi通过文件流下载文件到本地实例》本文以这篇文章的基础,提供了ByteArrayContent的下载以及在下载多个文件时实现在服务器对多文件进行压缩打包后下载的功能。关于本文中实现的在服务器端用.NET压缩打包文件功能的过程中,使用到了一个第方类库:DotNetZip,具体的使用将在正文中涉及。好了,描述了这么多前言,下面我们进入本文示例的正文。一、创建项目1.1首先创建名为:WebApiDownload的WebApi项目(C#);1.2接着新建一个空的控制器,命名为:DownloadController;1.3创建一些打包文件和存放临时文件的文件夹(downloads),具体请看本文最后提供的示例项目代码1.4打开NuGet程序包管事器,搜索DotNet
Unity中技能冷却效果
目标游戏中常见的技能冷却效果简单的UI布局最终效果步骤打开Unity新建一个工程,这里我们用2D的项目类型就可以。设置游戏界面比例为16:9,这个是当手机屏幕比较流行的横框比。给我们的技能一个容器,选择新建->UI->Panel,将默认生成的Canvas的设置修改如下:由于我们希望技能是栅格布局,所以给Panel增加一个GridLayoutGroup组件技能栏放在屏幕下方中间,所以设置Panel的锚点,依次点击下面的按钮设置,在选择锚点时,同时按下shift和alt键。修改pane的高度为120,宽度为230将下载好的技能icon图片导入到工程中,注意要检查图片的TextureType为Sprite,如果不是,改为Sprite向Panel中添加两个Button,删除默认的Text子节点,设置其SourceImage,分别重名为SkillDot和SkillFlash,并修改其Color为灰色(就是冷却时想显示的颜色)完成后如下:两个技能在panel的排列好像不太好看。。。如果每错的话,应该如下所
漫谈C#编程语言在游戏领域的应用
0x00前言:随着微软越来越开放,C#也变得越来越吸引人们的眼球。而在游戏行业中,C#也开始慢慢地获得了关注。这不,网易绝代双娇手游团队已经全面使用.NetCore支持前后端统一C#开发,跨平台部署了。所以,我们就来总结一下C#在游戏行业中一些具体的应用吧。0x01游戏引擎:说道游戏领域的应用,自然应该先来说说游戏引擎:Unity(Unity-GameEngine)不必多说了吧,随着“移动为王”潮流的到来,Unity3D也变得越来越流行。使用C/C++开发,提供C#作为脚本。移动游戏开发必备神器,而且随着VR热潮的到来,使用U3D开发VR内容也十分便利。总之,你值得拥有。Axiom(Axiom)Axiom是一款开源且跨平台的3D渲染引擎,提供了对Windows,Linux,Android,iPhone以及WindowsPhone等各个平台的支持。了解游戏开发的小伙伴们一定听说过OGRE渲染引擎吧?Axiom使用C#移植了OGRE。TorqueX(TorqueX|Products)由GarageG
Unity开发日记:Animator组件详解
好久没写博文,今天打算和大家分享点小知识,当当当当!那就是Animator!Animator是Unity中动画控制器的组件,这东西相当于一个动画片段管理器。我们知道Unity中素材可以拖拽到游戏对象上,制作成称为Clip的动画片段,如果该对象没有Animator组件,那么也会同时创建Animator用来管理Clip的切换和触发等。Animator中我比较常用的是Trigger,这个很多新人也都使用过了,用来从一个动画状态切换到另一个动画中。今天主要介绍的东西有两个,一个是BlendTree,另一个是StateMachineBehaviour。如果大家遇到了我遇到过的问题,那么这两个在关键时刻可谓是大杀器般的存在了。问题一:如何制作2D角色的多向动画当时我遇到的问题是:一个2D角色,需要四个方向的移动动画,还需要四个方向的攻击动画。当时技术水平所限,我直觉上想到的就是制作8个State,分别处理8段动画,8个trigger,然后在代码中来回切换。后来看到密密麻麻的State和Transition,发觉不对劲,于是数天的谷歌之后,开始学一
用Fiddler来辅助测试
fiddler是一款好用的web调试工具,能够记录客户端发出的所有http和https请求(tcp的不支持).虽然是一款调试工具,但是在测试或者分析系统的时候,是一个非常好用的软件。在测试过程中,经常向下面那样用1.捕捉请求,查看请求数据和相应数据假设是web系统(或者使用了http协议来作为数据交互数据的winform程序),直接在本机上安装并开启fiddler,然后做业务操作,fiddler就可以捕捉到请求如果是手机的,保持手机和电脑在同一个无线网络,在fiddler的tools--->fiddleroptions中,勾上“allowremotecomputerstoconnect”手机的无线网络上,代理设置为手动,并填写ip地址和端口号这样设置后,在手机上app的请求,可以在fiddler中捕捉到,便于查看请求和返回数据。不过,有些无线路由器支持ap分离,如果勾上了ap分离,则即使上面设置了,fiddler也是无法抓到包的2.伪造响应数据,快捷满足业务数据选择右侧的AutoResponder选择需要伪造相应的请求
[WinForm]WinForm跨线程UI操作常用控件类大全
前言在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作。不过会有一个问题:就是涉及到跨线程操作UI元素。相信才开始接触的人一定会遇上这个问题。为了解决这个问题,可以通过委托来实现。我为了后期使用更加方便,就将常用的几个控件(TextBox、Label、CheckBox、RadioButton、ProgressBar)UI操作进行了封装,源码可以在github上查看:GitHub仓库地址。源码在github仓库中的XY.WINUI.ControlEx.InvokeEx文件夹中使用示例在测试项目中有使用的方法,这里只做简单介绍。调用方法在Invokes类中,也可以使用单独的类调用。例如:在窗体中为tbName的TextBox设置和获取值//首先,使用命名空间usingXY.WINUI.ControlEx.InvokeEx;//第一种//设置TextBox的值Invokes.SetTextBoxText(tbName,"TextBox文本");//获取TextBox的值string
细说C#:委托的简化语法,聊聊匿名方法和闭包(下)
前文:细说C#:委托的简化语法,聊聊匿名方法和闭包(上)0x03使用匿名方法省略参数好,通过上面的分析,我们可以看到使用了匿名方法之后的确简化了我们在使用委托时还要单独声明对应的回调函数的繁琐。那么是否可能更加极致一些,比如用在我们在前面介绍的事件中,甚至是省略参数呢?下面我们来修改一下我们在事件的部分所完成的代码,看看如何通过使用匿名方法来简化它吧。在之前的博客的例子中,我们定义了AddListener来为BattleInformationComponent的OnSubHp方法订阅BaseUnit的OnSubHp事件。privatevoidAddListener(){this.unit.OnSubHp+=this.OnSubHp;}其中this.OnSubHp方法是我们为了响应事件而单独定义的一个方法,如果不定义这个方法而改由匿名方法直接订阅事件是否可以呢?答案是肯定的。privatevoidAddListener(){this.unit.OnSubHp+=delegate(B
深入浅出聊优化:从Draw Calls到GC
0x00前言刚开始写这篇文章的时候选了一个很土的题目。。。《Unity3D优化全解析》。因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的余地就少了很多。但又觉得这块是不得不提的一个地方,平时见到很多人对此处也给予了忽略了事,需要时才去网上扒一些只言片语的资料。也恰逢年前,寻思着周末认真写点东西遇到节假日没准也没什么人读,所以索性就写了这篇临时的文章。题目很土,因为用了指向性很明确的“Unity3D”,让人少了遐(瞎)想的空间,同时用了“高大全”这样的构词法,也让匹夫有成为众矢之的的可能。。。所以最后还是改成了现在各位看到的题目。话不多说,下面就开始正文~正所谓“草蛇灰线,伏脉千里”。那咱们首先~~0x01看看优化需要从哪里着手?匹夫印象里遇到的童靴,提Unity3D项目优化则必提DrawCall,这自然没错,但也有很不好影响。因为这会给人一个错误的认识:所谓的优化就是把DrawCall弄的比较低就对了。对优化有这种第一印象的人不在少数,drawcall的确是一个很重要的指标,但绝
Yii2 增删改查后仍留在当前页的方法
序言实现增删改查操作成功后仍留在当前页,能给用户一个良好的体验。但是Yii2框架本身是没有在增删改查操作成功后仍留在当前页的效果的,要实现这样的一个效果得自己写。我的原则是不动核心代码,始终坚持自己的原则,现实现了我把它分享出来。殊途同归,如有更好的实现方法,欢迎交流。需求分析1、实现增删改查后操作成功后仍然留在当前页面。效果图1、链接的效果图封装代码共有两个文件ActionColumn.php和Helper.php1、ActionColumn.php文件<?phpuseClosure;usekartik\icons\Icon;useYii;useyii\grid\Column;useyii\helpers\ArrayHelper;useyii\helpers\Html;useyii\helpers\Url;usecommon\components\Helper;/**重写ActionColumn*/classActionColumnextendsColumn{
NuGet 的 StackExchange.Redis 在 Mono 下会有不能连接 Redis 的问题
针对症状:排除配置问题后,针对同一段代码:从NuGet下载StackExchange.Redis在Windows下能连上Redis在各种下*nixmono环境下不能连上Redis直接结论:StackExchange.Redis在mono下有问题。(可能的)根本原因:mono和.Net的未知行为差异。解决方法:从githubcloneStackExchange.Redis调用源代码根目录下的./monobuild.bash用自己build出来的dll替换NuGet下载的dll
剖析并利用Visual Studio Code在Mac上编译、调试c#程序
0x00前言之前微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——VisualStudioCode。很多使用Windows的朋友都很高兴,认为又多了一个很不错的文档编辑器。不过我更关心的是它的跨平台能力,所以写了这篇小文来聊聊在Mac上如何使用VisualStudioCode编译和调试C#代码,最后我也会尝试把VisualStudioCode嵌入Unity3D中,作为一个准“IDE”使用。0x01VisualStudioCode是谁?好啦,既然要聊VisualStudioCode,那我们总是要先知道它是何方神圣吧?关注微软或者微软build大会的新闻的人,相信对它一定不陌生了。摘录几条当时的新闻,各位就能有个比较直观的印象了。新闻摘录一:在Build大会期间,微软发布了VisualStudio开发者工具中新的应用——VisualStudioCode。微软将VisualStudioCode描述为“代码优化编辑器”,这款工具免费向所有开发者开放下载,并提供Mac
解构 C# 游戏框架 uFrame 兼谈游戏架构设计
1.概览uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分)。因为用于Unity3D,所以它向开发者提供了一套基于Editor的可视化编辑工具,可以用来管理代码结构等。需要指出的是它的一个重要的理念,同时也是软件工程中的一个重要理念就是关注分离(Separationofconcern,SoC)。uFrame借助控制反转(IoC)/依赖注入(DI)实现了这种分离,从而进一步实现了MVVM这种模式。且在1.5版本之后,引入了UniRx库,引进了响应式编程的思想。本文主要描述uFrame的这种设计思路以及uFrame本身的一些重要概念,且文中的uFrame版本为1.6。2.基本概念2.1清晰且简单uFrame本身实现了一套MVVM的架构模式。我们之前更熟悉MVC架构模式,虽然MVC分层方式清楚,但是如果使用不当很可能让大量代码都集中在Controller之中,从而造成Controller的臃肿,甚至很多时候Controller和V
Unity3D 5.3 新版AssetBundle使用方案及策略
1.概览Unity3D5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代。因此,本文的主要内容就是分析5.X版本的AssetBundle机制(包括创建资源包、压缩资源包、加载资源包和从资源包中加载/卸载资源等几个方面)及其关键的API使用方式并总结一些对项目的建议(例如根据不同的情景,选择不同的包体加载方案等等)。2.AssetBundle系统的新功能本小节包括:AssetBundle系统的新功能新的AssetBundle系统的优势2.1.AssetBundle系统的新功能在新的AssetBundle系统中,出现了以下的新功能:通过Editor中的UI即可方便的为AssetBundle标记资源。而且一个资源和对应的AssetBundle的映射将会在资源数据库(AssetDatabase)中被创建。在箭头处即可指定该资源所述的AssetBundle,第一个选项为AssetBundle的名字,而后一个选项则是为AssetBu
Unity3D框架插件uFrame实用参考手册(一)
1.概览uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分)。因为用于Unity3D,所以它向开发者提供了一套基于Editor的可视化编辑工具,可以用来管理代码结构等。本文为uFrame1.6版本在项目中实践的记录,主要包括一些uFrame中的基本概念以及应用的流程。2.新建uFrame工程本小节主要内容包括:在uFrame新建工程在uFrame的可视化编辑器中打开工程仓库在uFrame的可视化编辑器中设置工程的命名空间,用来在生成模板代码时使用2.1.在uFrame中新建工程在Unity编辑器的Project部分新建一个文件夹,命名为MyProject。选中刚刚创建的文件夹右键选择:[u]Frame->NewProject。如图:此时,打开MyProject文件夹,我们创建的uFrame的工程仓库已经创建好了。我们可以对这个文件进行重命名,以符合自己的习惯。到此,我们就完成了在uFrame中创建一个新的工程的任务