C++设计模式感想

1.工厂模式和策略模式

工厂模式和策略模式比较相似,通过标签屏蔽子类的具体实现这是一种比较好的方法。用户类cache维护一个工厂抽象类ReplaceAlgorithm ,并通过标签生成相应的ReplaceAlgorithm 子类。
http://blog.csdn.net/wuzhekai1985/article/details/6665197

class ReplaceAlgorithm  
{  
public:  
    virtual void Replace() = 0;  
};  
//三种具体的替换算法  
class LRU_ReplaceAlgorithm : public ReplaceAlgorithm  
{  
public:  
    void Replace() { cout<<"Least Recently Used replace algorithm"<<endl; }  
};  

class FIFO_ReplaceAlgorithm : public ReplaceAlgorithm  
{  
public:  
    void Replace() { cout<<"First in First out replace algorithm"<<endl; }  
};  
class Random_ReplaceAlgorithm: public ReplaceAlgorithm  
{  
public:  
    void Replace() { cout<<"Random replace algorithm"<<endl; }  
};

enum RA {LRU, FIFO, RANDOM}; //标签  
class Cache  
{  
private:  
    ReplaceAlgorithm *m_ra;  
public:  
    Cache(enum RA ra)   
    {   
        if(ra == LRU)  
            m_ra = new LRU_ReplaceAlgorithm();  
        else if(ra == FIFO)  
            m_ra = new FIFO_ReplaceAlgorithm();  
        else if(ra == RANDOM)  
            m_ra = new Random_ReplaceAlgorithm();  
        else   
            m_ra = NULL;  
    }  
    ~Cache() { delete m_ra; }  
    void Replace() { m_ra->Replace(); }  
};  

2.单例模式

单例模式之前花了一部分时间研究,现在总结一下
简单单例模式,线程安全,但是在单例调单例的时候会出问题,因为调用第二个单例的时候,可能第二个单例还没有创建

class Singleton
{
public:
   static Singleton* GetInstance()
   {
       return &m_instance;
   }

private:
   Singleton(){};
   Singleton(Singleton const&); 
   Singleton& operator=(Singleton const&); 
   static Singleton m_instance;
};
Singleton Singleton::m_instance;

boost单例模式

class QMManager
{
protected:
    struct object_creator
    {
        object_creator()
        {
            QMManager::instance();
        }
        inline void do_nothing() const {}
    };
    static object_creator create_object_;

    QMManager();
    ~QMManager(){};
public:
    static QMManager *instance()
    {
        static QMManager instance;
        return &instance;
    }
};
QMManager::object_creator QMManager::create_object_;

以下是boost模板类:

template <typename T>
class Singleton
{
    struct object_creator
    {
        object_creator() { Singleton<T>::GetInstance(); }
        inline void do_nothing()const {}
    };
    static object_creator create_object;
public:
    typedef T object_type;
    static object_type& GetInstance()
    {
        static object_type obj;
        //据说这个do_nothing是确保create_object构造函数被调用
        //这跟模板的编译有关
        create_object.do_nothing();
        return obj;
    }
};
template <typename T> typename Singleton<T>::object_creator Singleton<T>::create_object;

class QMManager
{
protected:
    QMManager();
    ~QMManager() {};
    friend class Singleton<QMManager>;
public:
    void do_something() {};
};

int main()
{
    Singleton<QMManager>::instance()->do_something();
    return 0;
}

3.桥接模式

大量使用基类多态,这里是别人的例子代码:

//操作系统
class OS  
{  
public:  
    virtual void InstallOS_Imp() {}  
};  
class WindowOS: public OS  
{  
public:  
    void InstallOS_Imp() { cout<<"安装Window操作系统"<<endl; }   
};  
class LinuxOS: public OS  
{  
public:  
    void InstallOS_Imp() { cout<<"安装Linux操作系统"<<endl; }   
};   
//计算机  
class Computer  
{  
public:  
    virtual void InstallOS(OS *os) {}  
};   
class AppleComputer: public Computer  
{  
public:  
    void InstallOS(OS *os) { os->InstallOS_Imp(); }  
};  
int main()  
{  
    OS *os1 = new WindowOS();  
    OS *os2 = new LinuxOS();  
    Computer *computer1 = new AppleComputer();  
    computer1->InstallOS(os1);  
    computer1->InstallOS(os2);  
}

4.观察者模式

Object保存多个observer指针,一旦object有时间发生,遍历保存的observer指针,调用observer中的notify函数通知。感觉这种设计很直观,不过boost中也实现了观察者模式好像使用siginal2,QT的观察者模式局简单多了直接connect搞定

5.中介模式

这个模式和我写的一个消息队列的程序有点像,有时间的时候发上来

6.状态模式

这个模式有点意思,有点和观察者模式相似,和消息队列也搭得上边(感觉所有的东西都可以用消息队列来做。。。。)状态模式可以想象成这样:4个状态对应4个子类,某一个子类被触发了某个状态,然后notify基类,或者说调用基类的setstatus,基类获取状态,再根据条件调用相应子类的状态响应函数。或者叫状态选择器?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值