设计模式

设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。

1.单例模式:https://www.cnblogs.com/cxjchen/p/3148582.html

使用getinstance()函数获取类实例。

如果有很多线程的话,就爱会造成大量线程的阻塞。于是大神们又想出了双重锁定

Singleton* getInstance()
{
    if (instance == NULL)
    {
	lock();
    	if (instance == NULL)
    	{
       		instance = new Singleton();
    	}
    	unlock();
    }

    return instance;
}

这样只够极低的几率下,通过越过了if (instance == NULL)的线程才会有进入锁定临界区的可能性,这种几率还是比较低的,不会阻塞太多的线程,但为了防止一个线程进入临界区创建实例,另外的线程也进去临界区创建实例,又加上了一道防御if (instance == NULL),这样就确保不会重复创建了。

#ifndef _SINGLETON_H_
#define _SINGLETON_H_


class Singleton{
public:
	static Singleton* getInstance();

private:
	Singleton();
	//把复制构造函数和=操作符也设为私有,防止被复制
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);

	static Singleton* instance;
};

#endif

2.观察者模式:https://blog.youkuaiyun.com/lcl_data/article/details/9208561

概述:

        最近中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑客户端上,网页上,手机上,iPad上都可以查看到该证券的实时行情,这种情况下我们应该怎么设计我们的软件呢?我们可以这样:小明的所有客户端上都订阅中国证券这个股票,只要股票一有变化,所有的客户端都会被通知到并且被自动更新。

         这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。

   这里我们提供一个简单化的实例:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <vector>  
  3. #include <string>  
  4. using namespace std;  
  5. class Secretary;  
  6. // 看股票的同事类(观察对象,观察者)  
  7. class StockObserver  
  8. {  
  9. public:  
  10.     StockObserver(string strName, Secretary* strSub)  
  11.     {  
  12.         name = strName;  
  13.         sub = strSub;  
  14.     }  
  15.   
  16.     void Update();  
  17.   
  18. private:  
  19.     string name;  
  20.     Secretary* sub;  
  21. };  
  22.   
  23. // 秘书类(主题对象,通知者)  
  24. class Secretary  
  25. {  
  26.   
  27. public:  
  28.     string action;  
  29.     void Add(StockObserver ob) { observers.push_back(ob); }  
  30.     void Remove(int addIndex)  
  31.     {  
  32.         if(addIndex >=0 && addIndex < observers.size())  
  33.         observers.erase(observers.begin() + addIndex);  
  34.     }  
  35.     void Notify()  
  36.     {  
  37.         vector<StockObserver>::iterator it;  
  38.         for (it=observers.begin(); it!=observers.end(); ++it)  
  39.         {  
  40.             (*it).Update();  
  41.         }  
  42.     }  
  43.   
  44. private:  
  45.     vector<StockObserver> observers;  
  46. };  
  47.   
  48.   
  49.   
  50.   
  51. void StockObserver::Update()  
  52. {  
  53.     cout << name << " : " << sub->action << ", begin to work" << endl;  
  54. }  
  55.   
  56. int main()  
  57. {  
  58.     // 创建通知者  
  59.     Secretary* p = new Secretary();  
  60.   
  61.     // 观察者  
  62.     StockObserver* s1 = new StockObserver("Lazy", p);  
  63.     StockObserver* s2 = new StockObserver("SnowFire", p);  
  64.   
  65.     // 加入通知队列  
  66.     p->Add(*s1);  
  67.     p->Add(*s2);  
  68.   
  69.     // 事件  
  70.     p->action = "The boss is coming...";  
  71.   
  72.     // 通知  
  73.     p->Notify();  
  74.   
  75.     // 动态删除  
  76.     p->Remove(0);  
  77.       
  78.     p->Notify();  
  79.   
  80.     return 0;  
  81.   
  82. }  

适用性:

1.当一个抽象模型有两个方面其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 

2.当对一个对象的改变需要同时改变其它对象而不知道具体有多少对象有待改变。 

3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之你不希望这些对象是紧密耦合的。

优缺点:

观察者模式的效果有以下几个优点:

    1观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。

    2观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。

观察者模式有下面的一些缺点:

    1如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

    2如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。

    3如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。

    4虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值