首页 文章 精选 留言 我的

精选列表

搜索[c/c ],共10000篇文章
优秀的个人博客,低调大师

C++职责链模式

简述 职责链模式(Chain of Responsibility Pattern)使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 简述 模式结构 优缺点 适用场景 案例分析 代码实现 版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820 模式结构 UML 结构图: Handler(抽象处理者):定义了处理请求所需的接口。 ConcreteHandler(具体处理者):处理自己负责的请求,如果无法处理,则将请求传递给与之保持联系的后继者(即:successor)。 Client(客户端):请求的发起者,将访问 Handler 来处理它。 优缺点 优点: 降低耦合度,将请求的发送者和接收者解耦。 简化了对象,使得对象不需要知道链的结构。 增强给对象指派职责的灵活性,通过改变链内的成员或者调整它们的次序来动态改变职责。 增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。 缺点: 由于没有明确的接收者,所以无法保证请求一定会被处理(可能直到链的末端都得不到处理,也可能因为链没有配置正确而得不到处理。) 对于较长的职责链来说,请求可能涉及到多个处理对象,这将会使系统性能受到一定影响,而且不利于代码调试。 如果建链不当,可能会造成循环调用,这将导致系统陷入死循环。 适用场景 有多个对象可以处理同一请求,具体哪个对象处理由运行时刻自动确定。客户端只负责提交请求,而无须关心请求的处理对象是谁以及它是如何处理的。 在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。 案例分析 请假 - 流程处理 混迹职场,从来都身不由己,谁不想在繁忙的工作里偷得浮生半日闲。但请假从来都是一门技术活,拼技术,更拼情商! 无论如何,只要你愿意,从感冒到被绑架,一定能找出一万种理由: 自我诅咒版:感冒、发烧、肠胃炎 … 俗套肥皂剧:飞机延误、火车晚点、家里遭窃 … 大打感情牌:看望父母、失恋了 … 积劳成疾可怜版:工作压力太大、加班累坏了 … 无需理由的理由:老板,我是不是有 5 天年假? 彪悍的人生不需要解释,如果没有过这种请假经历,就不是职场老司机。。。 当员工发出请假请求时,链中的处理者可以对请求作出响应或者将其传递给上级。每个处理者都有自己的一套规则,而这套规则是他们可以批准的。审批流程:经理(1 天及以下) -> 总监(3 天及以下) -> 总裁(7 天为界限)。 代码实现 创建抽象处理者 抽象处理者除了提供一个处理请假的接口之外,还有一个很关键的地方就是定义后继者,这样便可以构建一条链: // handler.h #ifndef HANDLER_H #define HANDLER_H #include <iostream> // 抽象处理者 class IHandler { public: IHandler() { m_pSuccessor = NULL; } virtual ~IHandler() {} void SetSuccessor(IHandler *successor) { m_pSuccessor = successor; } virtual void HandleRequest(float days) = 0; protected: IHandler *m_pSuccessor; // 后继者 }; #endif // HANDLER_H 创建具体处理者 具体处理者包含 Manager、Director、CEO,它们的实现基本相同,只是批准的天数不一样: // concrete_handler.h #ifndef CONCRETE_HANDLER_H #define CONCRETE_HANDLER_H #include "handler.h" // 经理 class Manager : public IHandler { public: Manager() {} ~Manager() {} virtual void HandleRequest(float days) override { if (days <= 1) { std::cout << "Manager 批准了 " << days << " 天假" << std::endl; } else { m_pSuccessor->HandleRequest(days); } } }; // 总监 class Director : public IHandler { public: Director() {} ~Director() {} virtual void HandleRequest(float days) override { if (days <= 3) { std::cout << "Director 批准了 " << days << " 天假" << std::endl; } else { m_pSuccessor->HandleRequest(days); } } }; // 总裁 class CEO : public IHandler { public: CEO() {} ~CEO() {} virtual void HandleRequest(float days) override { if (days <= 7) { std::cout << "CEO 批准了 " << days << " 天假" << std::endl; } else { std::cout << "给你放长假,以后不用来上班啦!" << std::endl; } } }; #endif // CONCRETE_HANDLER_H 注意: 由于 CEO 位于最高层(处于链的末尾),所以请求到此结束,不会继续向下传递。 创建客户端 开始请假,说出你的理由: // main.cpp #include "concrete_handler.h" #ifndef SAFE_DELETE #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} } #endif int main() { IHandler *manager = new Manager(); IHandler *director = new Director(); IHandler *ceo = new CEO(); // 职责链:经理 -> 总监 -> 总裁 manager->SetSuccessor(director); director->SetSuccessor(ceo); manager->HandleRequest(1); manager->HandleRequest(2); manager->HandleRequest(5); manager->HandleRequest(10); SAFE_DELETE(manager); SAFE_DELETE(director); SAFE_DELETE(ceo); getchar(); return 0; } 输出如下: Manager 批准了 1 天假 Director 批准了 2 天假 CEO 批准了 5 天假 给你放长假,以后不用来上班啦!

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

C#加减乘除

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ch03Ex02 { class Program { static void Main(string[] args) { double firstNumber, secondNumber; string userName; Console.WriteLine("请输入姓名:"); userName = Console.ReadLine(); Console.WriteLine("请输入第一个数字:"); firstNumber = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入第二个数字:"); secondNumber = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("数字{0}加{1}结果是:{2}",firstNumber,secondNumber,firstNumber+secondNumber); Console.WriteLine("数字{0}减{1}结果是:{2}", firstNumber, secondNumber, firstNumber - secondNumber); Console.WriteLine("数字{0}乘{1}结果是:{2}", firstNumber, secondNumber, firstNumber * secondNumber); Console.WriteLine("数字{0}除{1}结果是:{2}", firstNumber, secondNumber, firstNumber / secondNumber); Console.WriteLine("数字{0}余{1}结果是:{2}", firstNumber, secondNumber, firstNumber % secondNumber); Console.ReadKey(); } } } 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6705465.html,如需转载请自行联系原作者

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

C#结构函数

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo { struct CustomerName { public string firstName, lastName; public string Name() { return firstName+" "+lastName; } } class Program { static void Main(string[] args) { CustomerName myCustomer; myCustomer.firstName = "Ji"; myCustomer.lastName = "Qing"; Console.WriteLine("客户的名字:{0}", myCustomer.Name()); Console.ReadKey(); } } } 结构struct函数,有意思。可以尝试利用这个特性。 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6748212.html,如需转载请自行联系原作者

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

C#接口,类,集成

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace Demo{ public abstract class MyBase { } internal class MyClass : MyBase { } public interface IMyBaseInterface { } internal interface IMyBaseInterface2 { } internal interface IMyInterface : IMyBaseInterface,IMyBaseInterface2 { } internal sealed class MyComplexClass : MyClass,IMyInterface { } class Program { static void Main(string[] args) { MyComplexClass myObj = new MyComplexClass(); Console.WriteLine(myObj.ToString()); Console.ReadKey(); } } }一个namespace可以定义多种类与接口,有意思。本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6758409.html,如需转载请自行联系原作者

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

C#对象深度克隆

有基础的开发者都应该很明白,对象是一个引用类型,例如: object b=new object(); object a=b; 那么a指向的是b的地址,这样在有些时候就会造成如果修改a的值,那么b的值也会跟随着改变(a和b是同一个引用内存地址)。 我们想要a和b都是各自互不影响的,那么只能是完全地新建一个新的对象,并且把现有对象的每个属性的值赋给新的对象的属性。也就是值类型的复制,这个操作就叫深度克隆。 这里我们写两个泛型方法分别对对象T和集合List<T>进行深度克隆的实现,我们的方法实现方式是“扩展方法”,就是能在原有的对象后面直接“点”操作。 下面我们来看一下深度克隆的算法实现: usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Reflection;/** *author:qixiao *create:2017-5-2511:52:21 **/namespaceQX_Frame.Helper_DG.Extends {publicstaticclassCloneExtends {publicstaticTDeepCloneObject<T>(thisTt)whereT:class { Tmodel=System.Activator.CreateInstance<T>();//实例化一个T类型对象 PropertyInfo[]propertyInfos=model.GetType().GetProperties();//获取T对象的所有公共属性 foreach(PropertyInfopropertyInfoinpropertyInfos) {//判断值是否为空,如果空赋值为null见else if(propertyInfo.PropertyType.IsGenericType&&propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) {//如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverternullableConverter=newNullableConverter(propertyInfo.PropertyType);//将convertsionType转换为nullable对的基础基元类型 propertyInfo.SetValue(model,Convert.ChangeType(propertyInfo.GetValue(t),nullableConverter.UnderlyingType),null); }else { propertyInfo.SetValue(model,Convert.ChangeType(propertyInfo.GetValue(t),propertyInfo.PropertyType),null); } }returnmodel; }publicstaticIList<T>DeepCloneList<T>(thisIList<T>tList)whereT:class { IList<T>listNew=newList<T>();foreach(varitemintList) { Tmodel=System.Activator.CreateInstance<T>();//实例化一个T类型对象 PropertyInfo[]propertyInfos=model.GetType().GetProperties();//获取T对象的所有公共属性 foreach(PropertyInfopropertyInfoinpropertyInfos) {//判断值是否为空,如果空赋值为null见else if(propertyInfo.PropertyType.IsGenericType&&propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) {//如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverternullableConverter=newNullableConverter(propertyInfo.PropertyType);//将convertsionType转换为nullable对的基础基元类型 propertyInfo.SetValue(model,Convert.ChangeType(propertyInfo.GetValue(item),nullableConverter.UnderlyingType),null); }else { propertyInfo.SetValue(model,Convert.ChangeType(propertyInfo.GetValue(item),propertyInfo.PropertyType),null); } } listNew.Add(model); }returnlistNew; } } } 本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1949344,如需转载请自行联系原作者

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

Objective-C之分类

Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject -(void) eat : (NSString *)food; @end Animal.m #import "Animal.h" @implementation Animal /** 吃/ -(void) eat:(NSString)food{ NSLog(@"I like eat %@" , food); } @end 在main入口中的测试 #import <Foundation/Foundation.h> #import "Animal.h" int main(int argc, const charargv[]) { @autoreleasepool { Animaldog = [[Animal alloc] init]; NSString *food = @"Bone"; [dog eat:food]; } return 0; } 结果 : 一 , 命名分类 AnimalPart h: #import <Foundation/Foundation.h> #import "Animal.h" @interface Animal (AnimalPart) -(void) call : ( NSString * ) sound;br/>@end m: #import "AnimalPart.h" @implementation Animal (AnimalPart) -(void) call:(NSString *)sound{ NSLog(@"I Call Sound : %@" , sound); } @end 测试: #import <Foundation/Foundation.h> #import "Animal.h" #import "AnimalPart.h" int main(int argc, const charargv[]) { @autoreleasepool { Animaldog = [[Animal alloc] init]; NSStringfood = @"Bone"; [dog eat:food]; //命名分类扩展的方法 NSStringsound = @"wang wang wang ......"; [dog call:sound]; } return 0; } 结果: 解释: 创建AnimalPart的h和m文件。但是AnimalPart作为Animal的扩展分类,只能写在()当中 。 实现在AnimalPart的M中间中实现代码(未命名分类在Animal的M中实现) 不能够扩展属性(未命名分类可以) 二 , 未命名分类 AnimalPartUnName 因为未命名分类不需要m文件所以只建立h文件 h文件 #import <Foundation/Foundation.h> #import "Animal.h" @interface Animal () @property NSString *name; -(void) Writename; @end 在Animal的m文件中实现 main文件 结果 本文转自Aonaufly51CTO博客,原文链接:http://blog.51cto.com/aonaufly/2044467,如需转载请自行联系原作者

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

Objective-C之协议

其实OC中的协议有点像接口或称抽象类。OC中的协议定义了一系列的方法 , 有些方法是必须实现的 , 有些方法是可以不用实现的。 定义一个协议的关键字是 :@protocol 例如: @protocol Ainy -(void) Print; @end 如上就是一个协议 , 协议的名称为Ainy 。定义了一个方法为-(void) Print 。 注意协议是在h文件中定义的 , 例如: 如何实现这个Ainy协议:使用<>括号 , 如下 我新建了一个Dog类 , 继承了Animal , 并且需要实现协议Ainy代码如下: 在Dog.m中的实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 // //Dog.m //PartDemo // //CreatedbyAppleon2017/12/3. //Copyright2017年Apple.Allrightsreserved. // #import"Dog.h" @implementationDog @synthesizeID; -( void )Print{ NSLog(@ "XiaoHuang" ); } @end 当然 , 可能在Animal中定义了 Aonaufly协议 , 如何同时显示Ainy 和 Aonaufly协议呢 ?? @interface Dog : Animal <Ainy , Aonaufly>用,隔开 问题来了 , 怎么定义可以不需要实现的方法 和 如何定义一定要实现的方法 @optional 定义不一定需要实现的方法(在其后的在所有的方法) @required 定义一定需要实现的方法(在其后的所有方法) 如何知道此类实现了Ainy协议了呢?? id Object; if( [Object conformsToProtocol : @protocol (Ainy)] == YES){ } 当让如果你知道Object一定实现了协议Ainy , 你可以这么干 id <Ainy> Object; 加入Object实现了协议Ainy , 如何知道Object实现了Ainy的方法 Dance呢 , 因为Dance是可以不用实现的方法 if( [Object respondsToSelector: @selector (Dance)] == YES ){ } 本文转自Aonaufly51CTO博客,原文链接:http://blog.51cto.com/aonaufly/2046979,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

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

用户登录
用户注册