随笔分类 -  设计模式

摘要:看到状态,大家能想起什么?抵触什么?我想到的有:状态机、状态模式、UML状态转换、一堆一堆的验证能否执行当前函数的验证代码抵触的有:UML状态机图如下:正视状态图只要有先后顺序的行为都可以想象成状态机,因为存在必须先做什么才能再做什么的现象,所以这种现象很常见,很普遍给出了流程图后,落实到代码级别还... 阅读全文
posted @ 2015-10-06 21:27 McKay 阅读(3600) 评论(3) 推荐(3) 编辑
摘要:普通的zk用法,如下写法:zk.Exists("/aaa", true);zk.Create(...);但是由于这些API会抛Zookeeper的Exception,比如ConnectionLossException, NoNodeException等,所以必须配合一堆try/catch的机制来ca... 阅读全文
posted @ 2014-07-08 23:11 McKay 阅读(3585) 评论(3) 推荐(5) 编辑
摘要:注明:此处所说的日志是指程序错误的日志。一般B/S程序记录日志的方式最多的方式是获取到exception后直接append到一个文本文件,当然也有记录到windows event log的。我们来讨论下当高并发量下的解决办法:有很多解决方式,如下:直接记录为txt/xml文件Windows Event Log当前进程的本地队列MSMQ独立进程中的WCF服务(进程间管道)独立进程中的WCF服务(异步调用方式)数据库Sql server的Service BrokerMongoDB(或者类似的NoSQL数据库)其实大多数情况下使用文本文件或者eventlog就可以了,不过这不在本次讨论范围,去掉。数 阅读全文
posted @ 2013-12-03 21:43 McKay 阅读(5071) 评论(4) 推荐(5) 编辑
摘要:我们的目标是从一个int的Array中,找出最小值。作为demo程序,我们先增加一个类,用来模拟Array,如下定义:class CArray { const int DefaultCapacity = 100; private int[] array; private int curPosition = -1; public CArray() { this.array=new int[DefaultCapacity]; curPosition = -1; }... 阅读全文
posted @ 2013-11-29 08:54 McKay 阅读(1567) 评论(1) 推荐(5) 编辑
摘要:先上一张本文所描述的适用场景图分布式场景,共3台server:前端ServerOrder App ServerWarehouse App Server功能:前端Server可以不停的发送Command到CommandBus,然后由CommandBus分配不同的Command到各自的app server去处理。前端Server可以只发送Command而不必等待Response前端Server可以同步等待Response返回MSMQ消息超过3.5M会自动转为网络共享方式传输消息对于同一Command的处理,可以通过增加App Server的方式来提高并发处理速度(比如:可以开2个app serve 阅读全文
posted @ 2013-09-05 00:38 McKay 阅读(3056) 评论(2) 推荐(5) 编辑
摘要:放心,这次不是说设计模式中的代理模式,说的是C#的RealProxy的用法,主要用于:通过给class贴标签,让class做更多的工作,比如判断是否存在缓存,有则直接返回缓存object,没有则保存为缓存,等待下次请求是可以更快的获取数据(当然这只是其中一种常用用途,MVC的Action就是采用这种方式)下面是序列图:.Net Object Generation interceptor属于.NET自身行为,不需要额外写代码。Code Consumer指想调用RealObject来进行调用的对象,比如控制台程序,或者WEB程序。ProxyAttribute里定义了具体代理类是哪个,这个代理类是自 阅读全文
posted @ 2013-07-30 11:08 McKay 阅读(4602) 评论(3) 推荐(1) 编辑
摘要:所谓半同步半异步是指,在某个方法调用中,有些代码行是同步执行方式,有些代码行是异步执行方式,下面我们来举个例子,还是以经典的PlaceOrder来说,哈哈。PlaceOrder的主要逻辑:public bool PlaceOrder(OrderInfo order){ //验证Order合法性 //OrderInfo增加到仓储 //生成order的pdf //通知客户,email方式}我们假设做出如下决定:public bool PlaceOrder(OrderInfo order)... 阅读全文
posted @ 2013-07-29 11:27 McKay 阅读(3326) 评论(4) 推荐(4) 编辑
摘要:我们先来看看本人对下面这两个名词的个人见解:软件架构:几乎每个软件系统的架构都是不同的,因为软件架构的第一步就是根据当前项目的重要需求及约束来制定一个个技术决策。软件框架:可以分成行业框架和通用框架。通用框架是对大多数软件项目常用的模块(底层+高层)进行封装(同时暴露热点)的一个集合,能提高开发速度以及质量行业框架是针对某特定领域,把类似领域逻辑提取出来进行封装(同时暴露热点)的一个集合,能提高开发速度以及质量行业框架可以是基于通用框架之上的。站在架构师的角度,针对架构的开发,会慢慢演变为针对框架的开发(由于需要考虑复用以及对开发人员友好API特性)伸缩性:一般是指机器级别的横向扩展,如:we 阅读全文
posted @ 2013-05-27 21:52 McKay 阅读(7126) 评论(25) 推荐(5) 编辑
摘要:设计模式:简单工厂模式工厂方法模式抽象工厂方法模式单例模式外观模式生成器模式原形模式中介者模式代理模式观察者模式命令模式迭代器模式组合模式模版方法模式策略模式状态模式备忘录模式享元模式解释器模式装饰器模式职责链模式桥接模式访问者模式企业应用架构模式事务脚本大家都懂的写法领域模型DDD的建模方法:领域对象、value对象Unit of WorkEntity Framework已经集成这功能了Lazy Load同上查询对象针对Specification类的自定义资源库RepositoryDTO和Message和WCF有关系,对大数据的soap需要自定义压缩、还原,否则占带宽并发锁Entity Fr 阅读全文
posted @ 2013-04-29 15:46 McKay 阅读(1343) 评论(1) 推荐(0) 编辑
摘要:性能低主要是由于I/O操作导致的延迟,导致了等待 ==>CPU很闲,处理速率却上不去解决办法: 减少I/O操作: 加入缓存来缓解I/O操作AppFabric或Memcached让出主线程,开启单独线程来处理I/O操作(主线程就能处理更多的IIS请求)PageAsyncTask, Parallel把大面积的数据(比如某字段中保存了1w个字符串,并且select了多行...OMG!),压缩后保存到磁盘,也能减少I/O消耗的时间ICSharpCode.SharpZipLib.dll如果系统是分多个物理计算机通信的,也要压缩message的内容,比如WCF自定义MessageFormat... 阅读全文
posted @ 2013-04-24 15:50 McKay 阅读(1128) 评论(3) 推荐(2) 编辑
摘要:本文讲PlaceOrder函数的实现(重点在业务逻辑层),让我们来分别用不同的设计模式来实现吧:装饰器模式、代理模式、命令模式、状态模式、模版模式。假设我们实现需求如下: 在PlaceOrder函数中需要做如下工作 1. 检查权限,未登录的不能递交订单 2. 计算税 3. 记录日志好了,让我们分别来实现吧....当然,是用不同的设计模式分别实现。装饰器模式实现请看PlaceOrder函数方法体:public bool PlaceOrder(OrderInfo order) { try { ... 阅读全文
posted @ 2013-04-12 17:19 McKay 阅读(3515) 评论(6) 推荐(3) 编辑
摘要:本篇是讲设计模式方面的,比较杂,不像书上的那样。我们先从很简单的一个需求开始:“想让系统中只存在一个SendEmailObject对象”代码:public class SendEmailObject { public bool Send() { Console.WriteLine("Email sent from : "+this.GetHashCode()); //加这个GetHashCode调用是用来查看instance是否同一个的 return false; } } pub... 阅读全文
posted @ 2013-04-11 19:06 McKay 阅读(2030) 评论(2) 推荐(4) 编辑