初识设计模式

Posted xiao-xiaozhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识设计模式相关的知识,希望对你有一定的参考价值。

??单例模式Singleton

官方:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Singleton类有一个GetInstance()方法,允许客户访问它的唯一实例。多线程时使用双重锁定。

class Singleton{
private static Sinleton instance;
private static readonly object syncRoot = new object();
private Singleton(){

}
public static Singleton GetInstance(){
if(instance==null){
lock(syncRoot){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}

私有的构造方法可以控制实例化,不能被new创建。

双重锁:n个线程,开始实例为null,都符合第一个if条件,第一个进入的线程对临界区资源加锁,创建完实例后,第二个线程还在,第二个判断的作用就是阻断已经进入的其他线程。

客户端调用的时候:Singleton s1 = Singleton.GetInstance();

??合成/聚合复用原则?

面向对象的六大原则之六。

官方:尽量使用合成/聚合,尽量不要使用类继承。

聚合表示的是一种弱的拥有关系,A包含B,B不是A的一部分,比如大雁和雁群。

合成表示的是一种强的拥有关系,A包含B,B是A的一部分,比如大雁和翅膀。

继承的话,子类与父类的耦合性太高,系统如果复杂的话,牵一发而动全身。

(好像忘记了,复习一下前几个原则:

1.开放-闭合原则:对扩展开放,对修改闭合,最好添加继承实现的子类,而不是更改类内容。

2.迪米特法则:两个类不直接通信,由第三者转发调用。

3.依赖倒转原则:不要依赖具体,要依赖抽象,也就是接口,即面向接口编程。

4.单一职责原则:一个类的职责不要太多,最好可以单一职责,松耦合。

5.里氏替换原则:子类实现父类功能,同时可以扩展功能,但不能修改父类。

设计模式处处围绕这些面向对象原则。

??桥接模式?

官方:将抽象部分与部分分离,使它们都可以独立地变化。

技术图片

如图所示,interface就是实现,shape就是抽象。circle可以与redcircle和greencircle建立联系。

??命令模式

官方:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

特点是有一个调用对象,请求以命令形式包裹在对象里,并传给调用对象,调用对象寻找可以处理该命令的receiver,由receiver执行命令。

敏捷开发原则告诉我们,不要为代码添加基于猜测的实际不需要的功能。在真正需要撤销/恢复时,再把原来的代码重构成命令模式就可。

??职责链模式

官方:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。

这不就是DNS 服务器的递归查询的一部分嘛,请求逐级上传,直到被处理或者最顶都没有处理。

这样处理的过程对用户是透明的,用户只需要向一个最低权限的对象传递请求,就会返回,但用户并不知道哪一个对象处理的请求。

以上是关于初识设计模式的主要内容,如果未能解决你的问题,请参考以下文章

Java初识方法

初识OpenGL 片段着色器(Fragment Shader)

初识OpenGL 片段着色器(Fragment Shader)

初识OpenGL (-)纹理(Texture)

初识OpenGL (-)纹理(Texture)

初识OpenGL (-)纹理(Texture)