定义 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 Strategy 模式典型的结构图为: 大家肯定看着很懵逼,其实第一次接触类图的时候我自己也是这样。 那么咱们举个例子来解释一下。 假设我们要实现一个角色游戏,context为所有角色的基类(例子的代码后面会实现,此处只是拿context举例,此处的context并不是基类),一个角色可以切换不同的武器。然后strategy则为不同的武器的基类,而不同的武器的攻击方式是不同的,斧头的攻击为砍,剑的攻击为刺,弓箭的话为射击。乍一看感觉好麻烦啊。难不成得给一个角色类把所有的武器类都包含进去,然后切换武器的时候删除掉之前的武器,然后再重新开辟一个新的武器类。这样子的话给我们设计会带来非常大的不方便。而且假如我们有了新的武器,比如魔法棒,那么我们不是应该给角色类里面再添加魔法棒类,这样的话会让角色类变得非常庞大,而且非常不利于后期的维护,我们不能每增加一个武器就给角色类添加一个武器类吧。所 继续阅读 >>


李佳灏 18/06/22 23:47:23
server.cpp #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/epoll.h> #include<netinet/in.h> #include<arpa/inet.h> #include<assert.h> #include<unistd.h> #include<errno.h> #include<string.h> #include<fcntl.h> #include<stdlib.h> #include<sys/epoll.h> #define MAX_EVENT_NUMBER 1024 #define TCP_BUFFER_SIZE 512 #define UDP_BUFFER_SIZE 1024 int setnonblock 继续阅读 >>


李佳灏 18/03/15 21:53:26
#pragma once #include<iostream> #include<string.h> using std::ostream; using std::istream; class my_string { private: char *data; int len; public: static const int npos = -1; //返回错误时的验证值 //构造函数 my_string() { data = new char[1]; data[0] = '\0'; len = 0; } my_string(const char *str); my_string(const my_string &s); my_string(const my_string &s, int begin, int end 继续阅读 >>


李佳灏 17/12/23 13:13:04
题目描述 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Example Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807. 这个题其实是大数相加的链表 继续阅读 >>


李佳灏 17/12/17 18:11:31
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h> #define COUNT 10 static int i = 1; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t even = PTHREAD_COND_INITIALIZER; pthread_cond_t uneven = PTHREAD_COND_INITIALIZER; //1 3 5 7 9 void* funA(void *arg) { while(i <= COUNT) { pthread_mutex_lock(&mutex); if(i % 2 != 0) { printf("funA 继续阅读 >>


李佳灏 17/12/10 19:06:37
性能优化 在刚接触c++时候就觉得c++很有意思,比如在c中用”=”赋值的一些语句可以使用”()”进行初始化,但是之前并没有十分理解初始化相比于赋值语句有什么优点,后来在学习了类之后,初始化列表的出现,让我对初始化有了更加深刻的理解。 首先看代码 #include<iostream> using namespace std; struct Test1 { Test1() //无参析构 { cout<<"Construct Test1"<<endl; } Test1(const Test1& t1) //拷贝构造 { cout<<"Copy constructor for Test1"<<endl; this->a = t1.a; } Test1& operator=(const Test1& 继续阅读 >>


李佳灏 17/12/03 21:44:15
题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的。为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地通过其他计算机实现和另外一台计算机连接。 为了使得任意两台计算机之间都是连通的(不管是直接还是间接的),需要在若干台计算机之间用网线直接连接,现在想使得总的连接费用最省,让你编程计算这个最小的费用。 输入描述 Input Description 输入第一行为两个整数n,m(2<=n<=100000,2<=m<=100000),表示计算机总数,和可以互相建立连接的连接个数。接下来m行,每行三个整数a,b,c 表示在机器a和机器b之间建立连接的话费是c。(题目保证一定存在可行的连通方案, 数据中可能存在权值不一样的重边,但是保证没有自环) 输出描述 Output Description 输出只有一行一个整数,表示最省的总连接费用。 样例输入 Sample Input 3 3 1 2 1 1 继续阅读 >>


李佳灏 17/11/24 21:49:49
main函数 test.c #include<stdio.h> #include<unistd.h> #include<pthread.h> #include"rwlock.h" my_pthread_rwlock_t rwlock = MY_PTHREAD_RWLOCK_INITIALIZER; #define N 5 void* thread_fun(void *arg) { my_pthread_rwlock_wrlock(&rwlock); printf("main thread get wrlock,\n"); sleep(12); my_pthread_rwlock_unlock(&rwlock); } void* thread_fun1(void *arg) { int index = *(int*)arg; printf("T 继续阅读 >>


李佳灏 17/11/08 22:54:36
信号量 信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。 信号量的值大于或等于0时表示可供并发进程使用的资源实体数;小于0时代表正在等待使用临界资源的进程数 1、信号集的创建或打开 int semget(key_t key, int sems, int sem_flags); key 是由ftok()的到的键值。 nsems指明要创建的信号集包含的信号个数,改参数后面还会提到。semflg为操作标志 IPC_CREATE:调用semget()时,会将本信号集中的key值和其他信号集中的key进行对比,如果存在相同的key,说明信号集已存在,此时返回该信号集的标识符,否则新建一个信号集并返回其标识符。 IPC_EXCL:该宏和IPC_CREATE一起使用,否则没有意义。当 semflg取PC_CREATE|IPC_EXCL时,表示如果发现信号集已经存在,则返回错误,错误码 为EEXIST。 2、信号量的操作 int semop(int sem 继续阅读 >>


李佳灏 17/11/07 16:59:19
介绍 c语言风格的注释为块注释,c++风格为行注释。 /*块注释*/ //行注释 在项目中人们喜欢用不同风格的注释,或者两种风格的注释混用,这并不影响代码的功能,但是在一些工具当中要求代码的注释风格统一为c或者c++风格。 所以写了一个处理文件注释的代码。 分析 我们使用了状态机的概念,即在对文件中各个字符检测的时候遇到特定的字符对全局变量赋不同的状态值,来代表代码所处的状态,下面为不同状态间相互转换的示意图。 例如 //Xi/*You*/Linux//Group 首先检测到了”//”这两个字符,进入c++状态,我们将”//”替换为”/* “然后将后面的”/ “,” /”,”//”换成两个空格代替,然后在最后加上”*/”.转换后如下 /*Xi You Linux Group*/ c语言状态下同理。 需要注意的是还有一种状态是引号的状态,在图中并未列出,在” “中的两种注释风格的注释都是无效的,它们被当作字符串处理,所以在” “中的注释的字符原样输出 继续阅读 >>


李佳灏 17/09/24 16:09:40