首页 文章 精选 留言 我的

精选列表

搜索[Windows应用SDK],共10000篇文章
优秀的个人博客,低调大师

[零基础学JAVA]Java SE应用部分-34.Java常用API类库

本季目标 1、StringBuffer类 2、Runtime 类 3、包装类与JDK 1.5的新特性——泛型 4、日期的操作类 5、Math类 6、Random类 1、StringBuffer(重点) · String 类的时候说过:String 类的内容一旦声明则不可改变,改变的只是其地址。那么如果现在非要使用循环不断的修改String内容的时候,则就可以使用StringBuffer,也是一个字符串,但是可以修改。 · String类中的字符串连接使用的是“+”,而StringBuffer中的连接使用的是append()方法。 看下效果: 在内容会不断修改的时候使用StringBuffer比较合适。 现在再看下效果哈~ StringBuffer是不能直接转成String 类对象,必须调用toString()方法才可以把一个StringBuffer 的对象变为String类的对象。 2、Runtime表示运行时(了解) 在一个JVM中只有一个运行时,可以通过此类调用本机的一些程序。 此类中所有的构造方法对外部不可见,也就是说构造方法被私有化了,所以看不见。 单态 --> 在整个JVM中只能有一个运行时,所以其内部必然有一个方法可以取得Runtime对象。 public static Runtime getRuntime() 看下效果: Exec方法返回的是一个Process对象 看下效果:记事本打开三秒后自动关闭了哈~ 3、包装类 在JAVA 中提出了一种概念:一切皆对象,如果有此概念的话,则肯定有个矛盾点: 基本数据类型是对象吗?肯定不是,那么此时如果要符合之前的理论,则必须把基本数据类型进行包装。 看下效果:这就是典型包装类的使用哈~ 实际上包装类即可以把一个基本类型包装成对象,也可以把包装类变为基本数据类型。 Integer --> int: public int intValue()可以实现 看下效果: 以上的操作在 JDK 1.4之前都是这样做的,必须手工进行装箱或拆箱操作,而且包装类是不能直接进行++或—操作的。 在JDK 1.5之后提供了自动的装箱和拆箱操作,用户不用像之前那样必须直接调用方法完成了。 看下效果: 3、包装类与JDK 1.5的新特性——泛型 思考题: 现在要求实现一个坐标的操作类,有以下三种坐标: · 整数:x = 30 ; y = 50 · 小数:x = 30.3 ; y = 50.5 · 字符串:东经,北纬 考虑点: 对于用户而言,肯定只关心x和y的设置,你不能说让用户自己去选择设置整数或小数等。 以上问题我通过方法的重载做?我们验证一下使用方法的重载哈~ 此处就可以使用JDK 1.5提供的新功能 —— 泛型,在运行的时候由外部指定具体的操作类型。 4、日期的操作类 取得当前的日期 可以直接使用java.util.Date类完成。 打印的时间:Tue Mar 10 21:05:44 CST 2009 这样的时间看起来很别扭,不太符合我们中国人的习惯。一般直接使用此类的话,得到的时间不是很舒服,可以直接使用另外一个类——Calendar,此类可以把时间精确到毫秒。 Calendar是一个抽象类,如果是抽象类,则此处肯定使用其子类完成。 看下效果: 下面我们有选择滴进行删减哈~ (2)日期的格式化类 例如,现在有以下一个时间: 2009-3-10 21:18:30:345 将以上的时间格式显示为: 2009年3月10日 21点18分30 秒345毫秒 把之前的日期格式重新格式化了一下。 如果要完成上面的功能,则就可以使用SimpleDateFormart类,此类可以使用固定的模板把时间扣出来。 看下效果哈~ 5、Math类 数学操作类,但是在面试中里面有一个方法比较常见: round()方法 ,这个方法主要就是四舍五入哈~~~ 四舍五入的操作类 来看下效果哈~ 6、Random类,取得随机数 看下效果: #######################Michael分割线####################### 谨以此博文 庆祝一下今天成为〓博客之星〓 #######################Michael分割线####################### 本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/137834 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

从零开始在iPhone上运行视频流实时预测模型应用,只需10步

1、买一台苹果电脑,建议MacBook Pro。 2、安装Xcode。 3、克隆TensorFlow:https://github.com/tensorflow/tensorflow.git 4、下载TensorFlow核心静态库,运行:tensorflow/contrib/makefiles/download_depencies.sh 。 5、编译生成iOS工程静态库,运行:tensorflow/contrib/makefile/build_all_iso.sh 。 6、进入iOS工程目录:/tensorflow/examples/ios/camera。 7、下载Google Inception V1 模型,放到data目录:http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz。 8、下载工程Pod依赖库,运行:pod install。 9、运行工程,点击:tf_camera_example.xcworkspace。 10、在Xcode选中iPhone作为打包设备,Run。 计划帮助1万个人把程序跑起来,如有疑问,可以加我微信咨询,请注明:移动AI。 欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

优秀的个人博客,低调大师

《.NET应用架构设计:原则、模式与实践》新书博客--试读-2.1.2 设计原则实战

2.1.2设计原则实战 下面我们就以一个简单的电子商务系统为背景:通过给定的产品分类ID获取该分类下的所有产品。 对于这个问题,基本上不用想就可以实现,如图2-1的类图设计。 图2-1获取分类产品的类图 其中: qProductService类被客户程序调用,通过调用GetAllProductsFrom方法来获取产品,并且此处还可以添加缓存策略或异常处理等机制。 qProduct类代表了产品的实体。 qProductRepository类用来从数据存储设备(数据库或XML等其他数据存储器)中读取产品信息。 注意为了减少读者不必要的麻烦,让理解更加直观,以后的章节中,都会给出完整的代码示例和项目图示。 在这个示例中,Visual Studio项目的结构图如图2-2所示。 图2-2Visual Studio解决方案图 正如之前所说:ProductService提供外部调用的方法接口,并且采用了缓存策略和异常处理机制,来提高程序的性能和健壮性,代码如下所示: usingSystem; usingSystem.Collections.Generic; usingSystem.Web; usingAgileSharp.Chapter2.Repository; usingAgileSharp.Chapter2.Domain; namespaceAgileSharp.Chapter2.Service { public classProductService { privateProductRepository productRepository = null; publicProductService() { productRepository = newProductRepository(); } publicList<Product> GetAllProductsFrom(intcategoryId) { List<Product> result = newList<Product>(); try { stringcacheKey = string.Format( "products_in_category_{0}",categoryId); result = HttpContext.Current.Cache.Get(cacheKey) asList<Product>; if(result == null) { result = productRepository.GetProductsFrom(categoryId); if(result != null&&result.Count> 0) { HttpContext.Current.Cache.Insert(cacheKey, result); } } } catch(Exception ex) { //Log will add here later } returnresult; } } } 至于 Product 和 ProductRepository 的代码就非常简单了,这里不多解释。 示例到这里,也许大家有个疑问:上面的代码有些什么问题? q ProductService 依赖于 ProductRepository 。在没有任何变化的情况下,这没有什么问题。但是如果现在项目换了数据存储设备,例如将数据库换成了 XML 文件,或者数据库的访问技术从 ADO.NET 换成了 Entity Framework ,那么 ProductRepository 的代码就得改变,这会使得整个项目都需要重新编译,重新部署。问题来了:此时系统中只有 ProductRepository 一个变化点,为什么非得要求整个项目重新编译,重新部署呢?难道不能只重新编译和部署那个变化的模块呢? q 代码不具有测试性能。要想知道此段功能代码是否按照了我们的意愿运行,可以通过人工审核,然后通过 GUI 界面获取数据来进行调试,此时的逻辑相对而言比较简单,此方法也还行得通。不过,一旦业务逻辑变得复杂或代码量的剧增,那么很难确保代码不会出错,而这些错误很多时候只会在运行时才能被发现。 q 缓存机制依赖于 HttpContext ,这不仅仅会让测试产生困难(尽管可以有 Mock ),而且会对后续系统的扩展有阻碍(例如采用分布式缓存)。 对以上的问题进行进一步分析,可以知道,这都是因为违背了以下设计原则: q ProductService 依赖了 ProductRepository 的具体实现,而 ProductRepository 是一个可能的变化点。也就是说: ProductService 这个高层模块依赖了 ProductRepository 底层模块,违背了依赖倒置原则,这也就使得一个 ProductRepository 变化,整个项目都需要重新编译,重新部署。同理,缓存机制也是。 q 对于可测试性的问题,严格来说,上面的代码是可以测试的,但是测试的时候必须依赖于外部的数据存储设备,例如数据库,那么测试的结果可能会由于数据的变动而不一样,而且每次测试所花的时间也会比较长。 接下来尝试重构上面的代码,让代码的组织方式更加的灵活和易于扩展。 既然上面代码主要是违背了 DIP依赖倒置原则(再次回顾一下DIP:依赖抽象,而不依赖具体实现)。 那么现在就提出接口 IProductRepository ,使得 ProductService 依赖这个接口,代码如下: using System.Collections.Generic; usingAgileSharp.Chapter2.Domain; namespaceAgileSharp.Chapter2.Repository { public interfaceIProductRepository { List<Product> GetProductsFrom(intcategoryId); } } 现在接口已经抽象出来了,ProductService可以直接依赖接口了,但是我们现在还需要一个实现IProductRepository接口的类ProductRepository,然后再采用LSP(里氏替换原则),用ProductRepository替换。代码如下: usingSystem; usingSystem.Collections.Generic; usingAgileSharp.Chapter2.Domain; namespaceAgileSharp.Chapter2.Repository { public classProductRepository:IProductRepository { //… } } 现在 ProductService 的代码如下所示: usingSystem; usingSystem.Collections.Generic; usingSystem.Web; usingAgileSharp.Chapter2.Repository; usingAgileSharp.Chapter2.Domain; namespaceAgileSharp.Chapter2.Service { public classProductService { privateIProductRepositoryproductRepository = null; publicProductService() { productRepository = newProductRepository(); } publicList<Product> GetAllProductsFrom(intcategoryId) { //... } } } 其实可以看到,上面 ProductService 的代码虽然提出了抽象接口,但问题依然存在:仍依赖于 ProductRepository 的具体实现。 问题到这里就好办了,可以采用工厂模式,通过读取配置文件进行反射或采用依赖注入等方法得到解耦。 可以看出:设计原则解决了变化点的问题,将 ProductRepository 这个变化点从 ProductService 中移出,然后一步步的迁移,最后把这个变化点引到了配置文件中,也就是将变化点引到了系统之外,也许这些正是我们需要的。 当当网:http://product.dangdang.com/product.aspx?product_id=22574513 京东地址: http://book.360buy.com/10893935.html 卓越地址: http://www.amazon.cn/mn/dp/B006NS2N0S 本文转自yanyangtian51CTO博客,原文链接:http://blog.51cto.com/yanyangtian/758289 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

[Android] Android工程以jar包形式向第三方应用提供服务

参考:http://www.cnblogs.com/0616--ataozhijia/p/4094952.html 以API 19为例: 系统默认提供的android.jar整体大小为:21.8 MB 手动删除资源文件后, android.jar大小为: 2.6 MB 从中可以确定: jar包中是可以放入资源文件的 那么 jar包中的资源是如何被调用的?? 以纯java方式: 见参考 以Android方式: 参考:http://blog.csdn.net/liguangzhenghi/article/details/8858544 1、jar被包含进其他项目后,最终生成的apk文件中包含jar中的资源(目录结构也是一样的),这个可以通过zip打开jar和apk查看。 2、jar中的资源应该也是被jvm管理起来的,但是由于其实际id与原始jar项目中产生的id不一致,导致使用原始jar项目中的资源id不能访问到实际资源。只能通过getClass().getClassLoader().getResourceAsStream()的方式进行访问。 对于使用jar方式进行组件开发,有以下需要注意: 1. jar包中一般只包含代码不包含资源。 2. 如果要在jar中包含资源,则资源文件不应该放在默认的res目录下(因为导入其他项目后可能出现重名冲突),应该在package目录下创建专用的资源目录,如此通过pakcage的不重名来确保导入后资源不冲突。同时,jar中代码不能直接使用R类中资源id进行访问,应该通过getClass().getClassLoader().getResourceAsStream()进行加载。 3. 字付串资源可以定义成常量的方式来使用。 分类: Android Pro 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/4097595.html如需转载请自行联系原作者 demoblog

优秀的个人博客,低调大师

系统架构师-基础到企业应用架构-系统设计规范与原则[下篇]

、上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范。如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具 体实现方式简单的分为面向过程与面向对象的开发方式,而目前更多的是面向对象的开发设计方式。具体的内容请看下图: 上图描述了软件设计的原则:低耦合,高内聚,并且简单说明了,如何实现这2个原则,通过分离关注点的方式。我们把功能称之为关注点。 二、摘要 本文将通过实例来讲解如何通过分离功能点,并且讲解分离关注点实现相应功能点时应该注意的问题。比如说一些相关的重要部分的内容。分离功能点是实现软 件功能的一项重要基础,随着软件复杂度的不断提高,传统分离关注点的技术是只从一种方式去分离关注点,例如按照功能或者按照结构等等,使得越来越多的关注点 得不到有效、充分的分离。因此有效、充分的分离关注点就是我们更好的实现软件功能的重要标准,那么我们如果想实现这个目的,就必须对软件同时从多种方式进行 分解,因为分解的越详细,那么系统的设计就越清晰,那么就更容易满足设计原则需求。通过分离关注点能够使软件的复杂度降到最低,同时可理解性得到提高。 本文将会举例说明如何同时按照多种方式去分离关注点。因为本文中的内容都是本人对工作过程中的经验与总结,不足之处在所难免,还请大家多多提出自己的 意见和建议,错误之处,在所难免,请大家批评指出。 三、本章大纲 1、上章回顾。 2、摘要。 3、本章大纲。 4、分离关注点的多种方式。 5、相关设计方法。 6、本章总结。 7、系列进度。 8、下篇预告。 四、分离关注点的多种方式 我的理解是分离关注点(功能点)的方式有以下几种及每种划分的原则,下面我们将会讲解如何按照不同的方式去划分一个系统,通过抽象功能点来降低软件系统的 复杂度,并且提高系统的可理解度。 1、按模型来划分 这里的模型划分分为概念模型与物理模型:当然这里的概念模型就是抽象模型,例如我们平时说的功能的分离,我们以B2C的产品管理来说吧,产品管理里面 至少拥有的功能是选择产品分类,选择产品单位,产品的扩展属性,产品的所属品牌等相关属性信息。那么我们闲来说说概念模型就是说是抽象模型,那么我们通过图 形化的方式来描述 这是添加一个产品必须具备的四个相关功 能点的分离。 那么我们在物理模型上如何去实现产品管理的物理模型呢?下面我们来看看。 简单的解释就是具体的每个功能点的具体业务设计模型,物理模式是概念模型的实现。 2、按层次来划分 层次可以简单的分为分层分离的方式与横切分离的方式,那么来举例说明,我们都知道横切和纵切,就是说看待的问题的角度,下面来举例说明如何以这2种 方式来分离功能点。 当然我们这里仍然以B2C系统为例来说明这样的情况。我们这里先来看分层分离的方式来处理。 我们的B2C可以简单按照如下方式进行分层,业务逻辑层与界面通过服务层来调用,这样可以避免UI层与业务层之间的耦合,而业务 逻辑层通过数据访问层与数据库进行交互。当然可能我这里的部分设计还存在不合理之处,还请大家多多提出宝贵意见,好让这个设计更加完善。 那么我们下面来看下横切分离方式的情况,我们知道,我们系统中可能会对管理员或者任何操作人员的操作的详细信息进行详细的记录,那么我们 就会通过日志的方式来处理,横切的方式就是系统从头到尾的任何一个功能处都会用到,这是一个横向分离关注点的过程。那么我们在设计系统操作日志时就会记录相应 的操作日志或者系统的错误日志等等相关信息。 操作日志与错误日志贯穿每个分层结构、分离关注点横向分离的方法实现就是AOP(面向方面编程)。当然我们后面会介绍AOP的具体实现方式细节。 五、相关设计方法 本节将会详细的阐述分层与横切分离关注点的二种编程方式的实现,通过编程方法实现关注的不同切面来分析设计方法的实现。这里介绍的二种编程方法是面向 对象的编程方法实现分层方式的分离关注点与面向切面的编程方法实现横切分离关注点的方式。 1、面向对象设计 首先、面向对象作为一种编程思想,我想在园子里面的大多数同仁都比较熟悉,我这里也不详细谈面向对象的设计,这里我们只是谈谈面向对象设计中的几个 原则和需要注意的方面。 我们知道面向对象的编程思想是把世界万物都看作是对象,而复杂的功能可以看作对象与对象之间的关系组成。那么我们在分离关注点后,那么每个关 注点可以进一步细化为多个对象及对象之间的关系。 那么我们来看看面向对象设计中的几个基本的原则,并且分别的举例说明: a、首先必须先从分离关注点中分析出对象及对象之间的关系。例如我们以B2C系统中的店铺管理来说。 图中简单描述了店铺管理中应有的对象。 图中简单的描述了对象之间的关系,店铺信息依赖店铺等级与店铺类型信息,店铺认证信息 依赖店铺信息。 b、对象分离出来之后,那么我们先来看看对象对应的类的几个相关原则: (1)、(SRP)单一职责原则,简单来说就是一个类只提供一种功能和仅有一个引起它变化的因素。如果我们发现一个类具有多个引起它变化的因素时就必须想办 法拆分成单独的类。下面来举例说明。我们这里以ORM中的实体接口层来说。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public interface IEntity { /// <summary> /// 保存 /// </summary> /// <returns>返回影响的行数</returns> int Save(); /// <summary> /// 删除 /// </summary> /// <returns>返回影响的行数</returns> int Delete(); /// <summary> /// 写入日志信息 /// </summary> /// <param name="message">写入信息</param> /// <returns>返回影响的行数</returns> int WriteLog( string message); } 很明显这里的写入日志与前面的对实体的持久化的操作明显不搭边,这样的可能会造成2中引起类发生改变的因素时就必须分离,那么就必须把它抽出来,单独定义一个接口。修改后结果如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public interface IEntity { /// <summary> /// 保存 /// </summary> /// <returns>返回影响的行数</returns> int Save(); /// <summary> /// 删除 /// </summary> /// <returns>返回影响的行数</returns> int Delete(); } public interface Logger { /// <summary> /// 写入日志信息 /// </summary> /// <param name="message">写入信息</param> /// <returns>返回影响的行数</returns> int WriteLog( string message); } (2)、(OCP)开发封闭原则:简单来说就是不能修改现有的类,而需要在这个类的功能之上扩展新的功能,这时通过开放封闭原则来实现这样的要求。该原则使我 们不但能够拥抱变化,同时又不会修改现有的代码。而这个原则的实现可以简单来说就是我们将一系列发生变化的类的行为抽象为接口,然后让这些类去实现我们定义 的接口,调用者通过接口进行操作。例如我们以MP3播放器来说。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 public interface IMP3 { /// <summary> /// 播放 /// </summary> /// <returns>返回操作是否成功</returns> bool Play(); /// <summary> /// 停止 /// </summary> /// <returns>返回操作是否成功</returns> bool Stop(); } 定义2个不同的实现 ? 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 /// <summary> /// 台电播放器 /// </summary> public class TD : IMP3 { #region IMP3 成员 public bool Play() { return true ; } public bool Stop() { return true ; } #endregion } /// <summary> /// 惠普播放器 /// </summary> public class HP : IMP3 { #region IMP3 成员 public bool Play() { return true ; } public bool Stop() { return true ; } #endregion } 通过一个测试类来模拟接口调用,通过依赖注入的方式实现。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Test { IMP3 mp3 = null ; public Test(IMP3 mp) { mp3 = mp; } public bool Play() { return mp3.Play(); } public bool Stop() { return mp3.Stop(); } } 具体的测试代码我就不书写了,我想大家都知道了。 (3)、(LSP)替换原则:简单的来说就是基类出现的地方,扩展类都能够进行替换,那么前提就是我们不能修改基类的行为。也就是说基类与扩展类可以互相相 容。在面向对象中可能会认为很容易实现,不过我们要注意有时候我们从父类中继承的行为有可能因为子类的重写而发生变化,那么此时可能就不满足前面说的不改变 基类本身的行为。我们最熟悉的多态其实这样的情况就不满足这个原则。需要注意的时,对调用者来说基类与派生类并不相同,我们简单来说明。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Test { private int tempValue=0; public void TestA() { tempValue = 2; } public virtual void TestB() { tempValue = 9; } } public class Test1 : Test { public override void TestB() { //如果调用该方法,那么tempValue的值可以和基类中的得到的值是相同的,如果不显示的调用几类方法,那么这个值将丢失 //则不满足替换原则。 base .TestB(); } } 通过上面的简单代码可知,里氏替换原则中需要注意的地方:当对具有virtual关键字和saled关键字的类或者方法需要特别注意,因为这些关键字会对继承类的 行为造成一定的影响,当然上面的例子中只是说了重写的情况,还有new的情况,就是把父类中的方法隐藏,同样都是不满足里氏替换原则的。本例中我们的 tempValue是私有类型的变量,那么在基类中可以访问到,派生类中却无法访问,所以我们要注意,在处基类替换时需要注意继承的成员函数的访问域,建议的方式是 虚方法访问的类的成员变量尽量使用保护类型,这样可以防止丢失的情况。当然基类中有虚方法访问了基类中定义的私有变量,那么如果在继承类中如果想不丢失该基 类中该虚方法对其内部的私有变量的访问,那么可以在继承类中通过“base.(函数名)”的形式来显示调用基类方法,可以保持基类的行为。 (4)、(DIP)依赖倒置原则:简单来说就是依赖于抽象而不应该依赖于实现,这样的目的就是降低耦合性。简单的来说就是让二个类之间的依赖关系通过接口来解 耦,让一个类依赖一个接口,然后让另外一个类实现这个接口,通过构造注入或者属性注入的方式来实现依赖。简单来说就是抽象不依赖于细节,细节依赖于抽象。下 面我们来举例说明: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /// <summary> /// 汽车制动系统 /// </summary> public interface IControl { int UpSpeed(); bool Brake(); } /// <summary> /// 其他服务 /// </summary> public interface IServer { bool Radio(); bool GPS(); } 具体的使用 ? 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 /// <summary> /// 汽车 /// </summary> public class Car { private IControl control = null ; private IServer server = null ; public Car(IControl con, IServer ser) { control = con; server = ser; } public void Start() { control.UpSpeed(); } public void Play() { server.Radio(); } public void Map() { server.GPS(); } } 上面简单的举例说明,并没有给出具体的实现,只要实现上面的2个接口即可,这里就不详细说明了,希望大家能够明白。错误之处还请大家指出。 (5)、(ISP)接口隔离原则:简单的来说就是客户不关心细节的东西,他就只关心自己能够得到的服务,而面向对象的原则我想大家都知道,通过接口的方式来提 供服务。因此我们提供给客户的是一系列的接口,那么这样就具有很好的低耦合性。我们来简单的举例说明:以ORM中的简单的持久化操作来说 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public interface IORM { /// <summary> /// 保存 /// </summary> /// <returns>返回影响的行数</returns> int Save(); /// <summary> /// 删除 /// </summary> /// <returns>返回影响的行数</returns> int Delet(); /// <summary> /// 获取所有列表 /// </summary> /// <returns>返回一个DataTable</returns> DataTable GetList(); } 这里我们让一个实体来继承实现。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class ORM : IORM { #region IORM 成员 public int Save() { return 1; } public int Delet() { return 1; } public System.Data.DataTable GetList() { return new System.Data.DataTable(); } #endregion } 业务层的实现 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Entity { private IORM orm = null ; public Entity(IORM orm1) { orm = orm1; } public int Save() { return orm.Save(); } public int Delete() { return orm.Delet(); } } 这里我就不贴出来测试代码的实现了,后面我会把代码贴出来下载,如果有兴趣的同仁可以下载看看。当然我这里只是抛砖引玉,不足之处,还请大家多多 指出。面向对象设计中还有很多的原则,这里也不会一一复述。这里只是冰山一角,还希望大家多多提出宝贵意见。 2、面向切面编程 面向切面编程,其实就是面向方面编程,其实这个概念很早之前就提出了,但是并没有广泛的流行,这个是比较让人不解的地方,我平时其实使用的也是比 较少的。不过我们在系统架构中却是非常有用,特别是在关注点的分离的过程中起到很大的作用。AOP的主要目的呢,是将横切的关注点与核心的分层形式的或者说是 功能组件的分离。下面我们来看看AOP中的如何实现方面编程。 面向方面编程中的方面并不是直接有编译器来实现,而是通过某种特殊的方式将方面合并到常规的源代码中,然后通过编译器编译的方式。我们知道一个方 面就是一个横切关注点,在实现方面的过程中,我们通常需要定义连接点与基于这个连接点上的通知来完成。下面我们来看看AOP的处理源代码的模型: AOP一般都是有框架提供注入的功能,而这里的代码注入功能与我们在面向对象的依赖注入不同。这里的注 入是将方面的代码植入到常规代码片段中。 下面我们先来介绍AOP中的连接点与通知。 连接点:用来标识某个类型中的植入某个方面的位置,而连接点可以是某个方法的调用,属性访问器,方法主体或者是其他。连接点一般用来标识注入某个 方面的类型中的代码位置。 通知:用来标识注入到类型中植入方面的具体的代码。简单来说就是要注入的方面代码。 目前在.NET中已提供AOP的植入基础功能。PIAB就是AOP在.NET下的一种实现方式。下面我们来简单的说说,当然园子里面不少的大牛也讨论过这个 PIAB的相关介绍及用法。大家可以参考这些作者的文章。 一般我们在.NET平台下有2种注入方面代码的方式,下面以图例来说明: 可能具体的实现方案这里枚举的并不全面。但是一般采取植入的方式就这2类了,运行期实现的方案较多,编译期实现则需要有第三方提供方面植入工具, 完成编译前的代码植入,并且必须保证植入的代码是可以编译通过的。 如果想详细了解PIAB请参考 :大牛Artech的PIAB系列《EnterLib PIAB深入剖析》系列博文汇总。 六、本章总结 本章详细的阐述了软件设计的规范与原则的实现方式,通过面向对象与面向方面编程来分离实现关注点,并且在实现过程中遵循的原则等。并且分析了分离关注点 中的分离方法与角度,通过多种方式及多角度的分离关注点,当然本文只是抛砖引玉,不足之处,还请大家多多提出宝贵意见。鄙人将在后续文章中持续改进,谢谢! 七、系列进度 八、下篇预告 下一篇我们将会开始讲解软件设计中最重要也是最基本的技能-设计模式,希望大家多多提出已经,后面3篇我们将会讲解如何在项目中使用设计模式及使用设计 模式需要注意的事项,将会举例说明每个设计模式可能出现的场景。希望大家持续关注! 九、Demo下载 下载:点击下载 本文转自 hot的fans 51CTO博客,原文链接:http://blog.51cto.com/2435232/600637

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册