Erlang实现的网络服务器性能是非常高的,一个典型的服务器比如proxy我们可以处理40万个包的进出,链接数在万级别的。当然这么高的网络 能力和底层的epoll实现有很大关系。那么通常我们的gen_tcp收到内核协议栈过来完整的封包的时候,有三种方式可以通知到我们,参见 inet:setopts文档{active, true | false | once}If the value is true, which is the default, everything received from the socket will be sent as messages to the receivin Read More
1 uniform() -> 2 {A1, A2, A3} = case get(random_seed) of 3 undefined -> seed0(); 4 Tuple -> Tuple 5 end, 6 B1 = (A1*171) rem 30269, 7 B2 = (A2*172) rem 30307, 8 B3 = (A3*170) rem 30323, 9 put(random_seed, {B1,B2,B3}),10 R = A1/30269 +... Read More
1 // graph.cpp : 定义控制台应用程序的入口点。 2 //邻接矩阵表示 3 #include "stdafx.h" 4 #include 5 #define INFINITY 32767 6 #define MAX_VEX 20 7 #define QUEUE_SIZE 20 8 bool *visited; //用来判断是否遍历过,为true则遍历过,为false,则未遍历过 9 10 typedef struct{ 11 cha... Read More
Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。UML图如下:在Component中声明所有用来管理子对象的方法,其中包括Add、Remove等,这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶节点和枝节点对于外界没有区别,它们具备 完全一致的行为 接口。但问题也很明显,因为Leaf类本身不具备Add()、Remove()方法的 功能,所以实现它是没有意义的。何时使用组合模式:当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个 Read More
装饰模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。Decorator提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。(优先使用组合而非继承)13.1.解释main(),老爸ISchoolReport,成绩单接口CFourthGradeSchoolReport,四年级成绩单ReportDecorator,成绩单装饰器基类HighScoreDecorator,最高分装饰器SortDecorator,班级排名装饰器说明:对“四年级成绩单”进行装饰,ReportDecorator必然有一个private变量指向ISchoolRep Read More
适配器模式,使用之处比较特殊,不属于常规设计模式,主要用于不同系统之间的处理。是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也是一个比较简单的模式,直接上代码了。看代码:8.1.解释main(),主程序IUserInfo,本系统内接口CUserInfo,本系统内实现类IOuterUser,外系统接口COuterUser,外系统实现类COuterUserInfo,本系统内适配类说明:COuterUserInfo实现IUserInfo接口,将外部系统实现类COuterUser转换成本系统内的接口IUserInfo。使用外部 Read More
桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。实现分离的办法就是增加一个类,11.1.解释main(),客户IProduct,产品接口CHouse,房子CIPod,ipodCClothes,服装CNewCorp,桥梁类,MakeMoney()是桥梁方法CNewHouseCorp,只能生产房子,所以构造函数是CHouse*CShanZhaiCorp,什么赚钱就生产什么,所以构造函数是IProduct*说明:客户直接使用CNewHouseCorp和CShanZhaiCorp类,在main()函数里构造产品,然后传到这两个类里。这两个类的MakeMoney()函数,先调用基类的Ma Read More
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。一段晦涩难懂的文字,实现创建不同表示的方法就是给创建的过程传入创建的参数。详细的还是看代码吧。10.1.解释main(),客户CCarModel,产品模型CBenzModel,奔驰模型CBMWModel,宝马模型ICarBuilder,建造者接口CBenzBuilder,奔驰建造者CBMWBuilder,宝马建造者CDirector,导演说明:CCarModel实现模板方法,Builder负责开始建造产品。建造产品时,构建的顺序由Director或main决定。注意:建造者模式和抽象工厂非常类似。建造者更重视 Read More
创建型: Builder: 当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要将复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步一步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得同样的构建过程可以创建不同的表示。 AbstractFactory:产品类:假设有A、B、C 三种"等级"的怪物类,而每种等级的怪物类下面又有着相同的怪物“种类”类(e.g. 男 or 女),工厂类:我们的工厂类是具体的“种类”工厂(e.g. 男 or 女),这个工厂类里面有相应的函数可以调用对应的“种类”的对应等级的函数(e.g. Read More
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。看代码:7.1.解释main(),女娲IHuman,产品接口CYellowHuman,抽象产品之一CYellowFemaleHuman,具体产品之一CYellowMaleHuman,具体产品之二CWhiteHuman,抽象产品之二CWhiteFemaleHuman,具体产品之三CWhiteMaleHuman,具体产品之四CBlackHuman,抽象产品之三CBlackFemaleHuman,具体产品之五CBlackMaleHuman,具体产品 Read More