初识设计模式
Posted xiao-xiaozhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识设计模式相关的知识,希望对你有一定的参考价值。
官方:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
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 服务器的递归查询的一部分嘛,请求逐级上传,直到被处理或者最顶都没有处理。
以上是关于初识设计模式的主要内容,如果未能解决你的问题,请参考以下文章
初识OpenGL 片段着色器(Fragment Shader)