設計模式--單例模式,觀察者模式,介面卡模式
設計模式的分類:
1.建立型模式: 與物件建立有關.單例模式
2.結構型模式:處理類或物件的組合.裝飾模式,介面卡模式
3.行為型模式:描述類或物件如何互動及如何分配職責.觀察者模式,策略模式
看c++的構造方法,無意中想到,構造方法要定義為public的,這樣才可以在main()函式中,例項化物件。後來查閱資料,發現有些設計模式是可以實現建構函式定義為private型別的。如下面簡單的單例模式:
此方法的侷限性比較大。
#include<iostream>
#include<string>
using namespace std;
class SingleInstance
{
private:
{
}
static SingleInstance* pInstance ; 4)//static成員函式只能操作static成員變數
public:
void print()
{
cout << this->m_str << endl;
}
//為什麼是static?因為要呼叫此方法,需要是物件,這裡無法例項化物件,定義成static,只有這一份,可以通過類名操作
static SingleInstance* getInstance() // 要在public中才能被其他成員方法呼叫
{
if( !pInstance )
pInstance = new SingleInstance; 2)
return pInstance; 3)
}
string m_str;
};
SingleInstance* SingleInstance::pInstance =NULL ; 5) // 初始化為NULL,在getInstance()中建立pInstance,static 成員變數的初始化必須在類外。
void main()
{
SingleInstance::getInstance()->print() ; 6)
}
//觀察者模式
#include <iostream>
#include <list>
using namespace std;
class observer
{
public:
virtual void notify()
{
cout<<"observe"<<endl;
}
};
class Aobserver:public observer
{
public:
void notify()
{
cout<<"A observer"<<endl;
}
};
class Bobserver:public observer
{
public:
void notify()
{
cout<<"B observer"<<endl;
}
};
class subject
{
public:
list<observer *> observe;
void add(observer * m_observer)
{
observe.push_back(m_observer);
}
void ToNotify()
{
list<observer *>::iterator it=observe.begin();
for( ;it !=observe.end(); it++)
{
(*it)->notify();
}
}
};
void main()
{
Aobserver a;
Bobserver b;
subject sub;
sub.add(&a);
sub.add(&b);
sub.ToNotify();
system("pause");
}
介面卡模式
class adaptee
{
public:
void test(char * ptr)
{
cout<<ptr<<endl;
}
};
class target
{
public:
virtual void lwq(string str)
{
}
};
class adapter:public adaptee,publictarget
{
public:
void lwq(string str)
{
this->test(const_cast<char *>(str.c_str()));
}
};
void main()
{
target *tar=new adapter;
tar->lwq("lwq");
delete tar;
}