09 2016 档案

摘要:关键字:DownloadManager,BroadcastReceiver,getSystemService,URLConnection,HttpURLConnection,DocumentBuilderFactory,DocumentBuilder 阅读全文
posted @ 2016-09-30 17:48 guqiangjs 阅读(572) 评论(0) 推荐(0)
摘要:设计运行在简易台灯中的软件。台灯由一个开关和一盏灯组成。可以询问开关是开着还是关着,也可以让灯打开或者关闭。 下面设计了一个简易的模型。Switch对象可以轮询实际开关的状态,并且可以发送相应的turnOn和turnOff消息给Light。 这个设计违反了两个设计原则:依赖倒置(DIP)和开放-封闭 阅读全文
posted @ 2016-09-29 18:15 guqiangjs 阅读(589) 评论(0) 推荐(0)
摘要:地铁旋转门 最直接的实现FSM策略的方式是使用嵌套switch/case语句。 对于简单的状态机来说,嵌套switch/case实现既简单又优雅。所有的状态和事件都出现在一、两页代码中。然而,对于大型的FSM来说,情况就不同了。在一个具有大量状态和事件的状态机中,代码就退化成一页页的case语句。并 阅读全文
posted @ 2016-09-29 16:19 guqiangjs 阅读(965) 评论(0) 推荐(0)
摘要:你需要向类层次结构中增加新的方法,但是增加起来会很费劲或者会破坏现有设计。这是一个很常见的问题。 假设你有一个Modem对象的层次结构。基类中具有对于所有调制解调器来说公共的通用方法。派生类代表正对许多不同调制解调器厂商和类型的驱动程序。同样假设有一个需求,要向该层次结构中增加一个新方法,名为con 阅读全文
posted @ 2016-09-29 14:55 guqiangjs 阅读(289) 评论(0) 推荐(0)
摘要:数字时钟 我们有一个时钟对象。该对象捕获来自操作系统的毫秒终端(即时钟滴答),并把它们转换成时间。该队想知道如何从微秒数计算出秒数,如何从秒数计算出分钟数等等。它知道每个月有多少天,以及每年有几个月。它知道有关闰年的所有信息,并且可以判断出什么时候是闰年,而什么时候不是闰年。 我们想创建一个数字时钟 阅读全文
posted @ 2016-09-28 16:59 guqiangjs 阅读(303) 评论(0) 推荐(0)
摘要:接口IShape有两个派生类:Circle和Square。第三个派生类是一个组合体。CompositeShape持有一个含有多个Shape实例的列表。当调用CompositeShape的drwa()方法时,它就把这个方法委托给列表中的每一个Shape实例。 因此,对系统来说,一个CompositeS 阅读全文
posted @ 2016-09-28 16:06 guqiangjs 阅读(248) 评论(0) 推荐(0)
摘要:依赖倒置原则(DIP)告诉我们应该优先依赖于抽象类,而避免依赖于具体类。当这些具体类不稳定时,更应该如此。因此,下面的代码片段违反了这条原则: Circle是一个具体类。所以,创建Circle类实例的模块肯定违反了DIP。事实上,任何一行使用了new关键字的代码都违反了DIP。 有时,违反DIP是无 阅读全文
posted @ 2016-09-14 17:03 guqiangjs 阅读(201) 评论(0) 推荐(0)
摘要:考虑以下代码 大多数人曾经由于忘记对null进行检查而受挫。该管用手法虽然常见,但却是丑陋且易出错的。 通过让Db.GetEmployee抛出一个异常而不是返回null,可以减少出错的可能性。不过,try/catch块对比null的检查更加丑陋。 可以使用NULL OBJECT模式来解决这些问题。通 阅读全文
posted @ 2016-09-14 16:47 guqiangjs 阅读(171) 评论(0) 推荐(0)
摘要:FACADE模式 Db类使得Application类不需要了解System.Data命名空间中的内部细节。它把System.Data的所有通用性和复杂性隐藏在一个非常简单且特定的接口后面。 像Db这样的FACADE类对System.Data的使用施加了许多规约。它知道如何初始化和关闭数据库连接。它知 阅读全文
posted @ 2016-09-14 16:02 guqiangjs 阅读(468) 评论(0) 推荐(0)
摘要:TEMPLATE METHOD模式 TEMPLATE METHOD模式展示了面向对象编程中诸多经典重用形式中的一种。其中通用算法被放置在基类中,并且通过继承在不同的具体上下文中实现该通用算法。但是这项技术是有代价的。继承是一种非常强的关系。派生类不可避免地要和它们的基类绑定在一起。 STRATEGY 阅读全文
posted @ 2016-09-14 15:38 guqiangjs 阅读(289) 评论(0) 推荐(0)
摘要:COMMAND模式 事物 Undo方法 摘录自:[美]RobertC.Martin、MicahMartin著,邓辉、孙鸣译 敏捷软件开发原则、模式与实践(C#版修订版) [M]、人民邮电出版社,2013、219-228、 阅读全文
posted @ 2016-09-14 15:12 guqiangjs 阅读(156) 评论(0) 推荐(0)
摘要:前3个原则-包的内聚性原则-是用来指导如何把类划分到包中的。后3个原则用来管理包之间的耦合,有助于我们处理包之间的相互关系。最后两个原则同时还给出了一组依赖管理度量,可以使得开发者度量、刻画设计的依赖结构。 组件的内聚性原则:粒度 组件的内聚性原则可以帮助开发者决定如何把类划分到组件中。这些原则基于 阅读全文
posted @ 2016-09-14 14:39 guqiangjs 阅读(1536) 评论(0) 推荐(1)
摘要:如果类的接口不是内聚的,就表示该类具有“胖”接口。换句话说,类的“胖”接口可以分解成多组方法。每一组方法服务于一组不同的客户程序。 ISP承认有一些对象确实需要有非内聚的接口,但是ISP建议客户程序不应该看到它们作为单一的类存在。相反,客户程序看到的应该是多个具有内聚接口的抽象基类。 接口污染 考虑 阅读全文
posted @ 2016-09-12 18:25 guqiangjs 阅读(520) 评论(0) 推荐(0)
摘要:DIP 依赖倒置原则 依赖于低层模块的高层模块意味着什么?正是高层模块包含了应用程序中重要的策略选择和业务模型。这些高层模块使得其所在的应用程序区别于其他。然而,如果这些高层模块依赖于低层模块,那么对于低层模块的改动会直接影响到高层模块,从而迫使它们依次做出改动。如果高层模块独立于低层模块,那么高层 阅读全文
posted @ 2016-09-09 15:27 guqiangjs 阅读(381) 评论(0) 推荐(0)
摘要:Liskov替换原则:子类型(subtype)必须能够替换掉它们的基类型(basetype)。 违反LSP的情形 对于LSP的违反常常会导致以明显违反OCP的方式使用运行时类型检查。通常,会使用一个显式的if语句或者if/else链去确定一个对象的类型,以便于可以选择针对该类型的正确行为。 很显然, 阅读全文
posted @ 2016-09-08 17:37 guqiangjs 阅读(615) 评论(0) 推荐(0)
摘要:软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。 如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化性的臭味。OCP建议我们应该对系统进行重构,这样以后对系统再进行这样那样的改动时,就不会导致更多的修改。如果正确地应用OCP,那么以后再进行同样的改动时, 阅读全文
posted @ 2016-09-04 23:23 guqiangjs 阅读(1116) 评论(2) 推荐(1)