0%

隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口
降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

阅读全文 »

一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
把不变的部分移至父类, 去除子类重复代码

阅读全文 »

原型模式是用于创建重复的对象,同时又能保证性能, 当直接创建对象的代价比较大时例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

阅读全文 »

创建具有现有对象的对象,以便向外界提供功能接口。用于解决直接访问对象时带来的问题

阅读全文 »

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

策略模式相对简单工厂耦合度更低, 只需要开放一个类给客户端

无论是简单工厂还是策略模式都没有消除switch, 若想消除可用反射, 参考抽象工厂模式

阅读全文 »

Git配置

打开.gitconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[difftool "codecompare"]
cmd = \"C:\\Program Files\\Devart\\Code Compare\\CodeCompare.exe\" -W \"$LOCAL\" \"$REMOTE\"
renames = true

[diff]
tool = codecompare
guitool = codecompare
[mergetool "codecompare"]
cmd = \"C:\\Program Files\\Devart\\Code Compare\\CodeMerge.exe\" -MF \"$LOCAL\" -TF \"$REMOTE\" -BF \"$BASE\" -RF \"$MERGED\"
trustExitCode = true
[mergetool]
keepBackup = false
[merge]
tool = codecompare
guitool = codecompare

抽象工厂, 将工厂抽象出来

工厂方法模式和抽象工厂模式都是创建型设计模式,它们的主要区别在于所创建的对象范围不同。

工厂方法模式(Factory Method)通过让子类实现工厂接口,来决定具体应该创建哪一个产品类的实例对象。它允许我们在不改变现有代码基础上添加新的产品类型,并且可以将具体产品的实现与调用方分离开来。

抽象工厂模式(Abstract Factory)与工厂方法模式类似,也是用于创建一系列相关的对象。不同之处在于,抽象工厂是针对多个产品族而言的,即每个工厂可以创建多种不同类型的产品。这样的话,抽象工厂为创建一组相关或独立的对象提供了一种方式。

工厂方法模式通常只针对一个抽象产品类进行创建,而抽象工厂模式则需要针对多种抽象产品进行创建。

阅读全文 »

一个工厂类只创建一个产品

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
将所要创建的具体对象放在子类, 实现扩展(非更改)

阅读全文 »

基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git commit --amend #合并并修改上次提交

git tag v1.0.0
git tag -a v1.0.0 -m "Release version 1.0.0" HEAD

git push origin {标签名}
git push origin --tags

git branch -D master #删除master分支
git branch -m master #重新命名当前独立分支为 master

git log --oneline --graph --all -5 #查看所有分支的图形记录的前5条

git merge branchName #合并branchName分支到当前分支
git merge branchName -Xignore-space-change whitespace #合并branchName分支到当前分支并忽略空白符

git fetch origin master:temp #从远程的origin仓库的master分支下载到本地并新建一个分支temp
git diff temp #比较master分支和temp分支的不同
阅读全文 »

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <summary>
/// 循环移位
/// </summary>
/// <param name="val">输入的数字</param>
/// <param name="iShiftBit">要移几位</param>
/// <param name="isLeft">移位的方向</param>
/// <returns>移位后的数字</returns>
private static uint CycleShift(uint val, int iShiftBit, bool isLeft)
{
uint temp = 0;
uint result = 0;
temp |= val;
if (isLeft)
{
val <<= iShiftBit;
temp >>= (32 - iShiftBit);
result = val | temp;
}
else
{
val >>= iShiftBit;
temp <<= (32 - iShiftBit);
result = val | temp;
}
return result;
}

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Thread update;
public Form1()
{
InitializeComponent();
update = new Thread(UpdateFunc);
}

//子线程更新主界面Label值
void UpdateFunc()
{
while (true)
{
Invoke(()=> label1.Text = DateTime.Now.ToString("HH:mm:ss"));
Invoke((string x)=> label1.Text = x + DateTime.Now.ToString("HH:mm:ss"),"时间:");
Thread.Sleep(500);
}
}

限制可同时访问某一资源或资源池的线程数

Semaphore sema = new Semaphore(x,y)
x: 线程池中空位数
y: 线程池的总数

阅读全文 »