wordpress插件小蜜蜂seo的形式有哪些
前言
? ? ? ? 這個模式帶給我們有關(guān)組合跟繼承非常多的思考
定義
? ? ? ? “單一職責(zé)” 模式。動態(tài)(組合)的給一個對象增加一些額外的職責(zé)。就增加功能而言,Decorator模式比生成子類(繼承)更為靈活(消除重復(fù)代碼 & 減少子類個數(shù))
?
動機(jī)
? ? ? ? 在某些情況下我們可能會 “過度的使用繼承來擴(kuò)展對象的功能”,由于繼承為類型引入的靜態(tài)特質(zhì),使得這種擴(kuò)展方式缺乏靈活性;并且隨著子類的增多(擴(kuò)展功能的增多)。各種子類的組合(擴(kuò)展功能的組合)會導(dǎo)致更多子類的膨脹
? ? ? ? 如何使 “對象功能的擴(kuò)展” 能夠根據(jù)需要來動態(tài)的實現(xiàn)?同時避免 “擴(kuò)展功能的增多” 帶來的子類膨脹問題? 從而使得任何 “功能擴(kuò)展變化” 所導(dǎo)致的影響降為最低?
案例
? ? ??代碼
// 版本1
//業(yè)務(wù)操作
class Stream{
public:virtual char Read(int number) = 0;virtual void Seek(int position) = 0;virtual void Write(char data) = 0;virtual ~Stream(){}
};//主體類
class FileStream : public Stream {
public:virtual char Read(int number) {//讀文件流}virtual void Seek(int position) {//定位文件流}virtual void Write(char data) {//寫文件流}};class NetworkStream : public Stream {
public:virtual char Read(int number) {//讀網(wǎng)絡(luò)流}virtual void Seek(int position) {//定位網(wǎng)絡(luò)流}virtual void Write(char data) {//寫網(wǎng)絡(luò)流}
};class MemoryStream : public Stream {
public:virtual char Read(int number) {//讀內(nèi)存流}virtual void Seek(int position) {//定位內(nèi)存流}virtual void Write(char data) {//寫內(nèi)存流}
};//擴(kuò)展操作
class CryptoFileStream : public FileStream {
public:virtual char Read(int number) {//額外的加密操作...FileStream::Read(number);//讀文件流}virtual void Seek(int position) { //額外的加密操作...FileStream::Seek(position);//定位文件流//額外的加密操作...}virtual void Write(byte data) {//額外的加密操作...FileStream::Write(data);//寫文件流//額外的加密操作...}
};class CryptoNetworkStream : public NetworkStream{
public:virtual char Read(int number) {//額外的加密操作...NetworkStream::Read(number);//讀網(wǎng)絡(luò)流}virtual void Seek(int position) {//額外的加密操作...NetworkStream::Seek(position);//定位網(wǎng)絡(luò)流//額外的加密操作...}virtual void Write(byte data) {//額外的加密操作...NetworkStream::Write(data);//寫網(wǎng)絡(luò)流//額外的加密操作...}
};class CryptoMemoryStream : public MemoryStream {
public:virtual char Read(int number) {//額外的加密操作...MemoryStream::Read(number);//讀內(nèi)存流}virtual void Seek(int position) {//額外的加密操作...MemoryStream::Seek(position);//定位內(nèi)存流//額外的加密操作...}virtual void Write(byte data) {//額外的加密操作...MemoryStream::Write(data);//寫內(nèi)存流//額外的加密操作...}
};class BufferedFileStream : public FileStream {//...
};class BufferedNetworkStream : public NetworkStream {//...
};class BufferedMemoryStream : public MemoryStream {//...
}class CryptoBufferedFileStream : public FileStream {
public:virtual char Read(int number) {//額外的加密操作...//額外的緩沖操作...FileStream::Read(number);//讀文件流}virtual void Seek(int position) {//額外的加密操作...//額外的緩沖操作...FileStream::Seek(position);//定位文件流//額外的加密操作...//額外的緩沖操作...}virtual void Write(byte data) {//額外的加密操作...//額外的緩沖操作...FileStream::Write(data);//寫文件流//額外的加密操作...//額外的緩沖操作...}
};void Process() {//編譯時裝配CryptoFileStream *fs1 = new CryptoFileStream();BufferedFileStream *fs2 = new BufferedFileStream();CryptoBufferedFileStream *fs3 =new CryptoBufferedFileStream();
}// 版本2
//業(yè)務(wù)操作
class Stream{
public:virtual char Read(int number) = 0;virtual void Seek(int position) = 0;virtual void Write(char data) = 0;virtual ~Stream(){}
};//主體類
class FileStream : public Stream {
public:virtual char Read(int number) {//讀文件流}virtual void Seek(int position) {//定位文件流}virtual void Write(char data) {//寫文件流}};class NetworkStream : public Stream {
public:virtual char Read(int number) {//讀網(wǎng)絡(luò)流}virtual void Seek(int position) {//定位網(wǎng)絡(luò)流}virtual void Write(char data) {//寫網(wǎng)絡(luò)流}
};class MemoryStream : public Stream {
public:virtual char Read(int number) {//讀內(nèi)存流}virtual void Seek(int position) {//定位內(nèi)存流}virtual void Write(char data) {//寫內(nèi)存流}
};//擴(kuò)展操作
class CryptoStream : public Stream {Stream* stream; //...public:CryptoStream(Stream* stm) : stream(stm) {}virtual char Read(int number) {//額外的加密操作...stream->Read(number);//讀文件流}virtual void Seek(int position) {//額外的加密操作...stream::Seek(position);//定位文件流//額外的加密操作...}virtual void Write(byte data) {//額外的加密操作...stream::Write(data);//寫文件流//額外的加密操作...}
};class BufferedStream : public Stream{Stream* stream; //...public:BufferedStream(Stream* stm):stream(stm) {}//...
};void Process() {//運(yùn)行時裝配FileStream* s1= new FileStream();CryptoStream* s2= new CryptoStream(s1);BufferedStream* s3= new BufferedStream(s1);BufferedStream* s4= new BufferedStream(s2);
}// 版本3
//業(yè)務(wù)操作
class Stream{
public:virtual char Read(int number) = 0;virtual void Seek(int position) = 0;virtual void Write(char data) = 0;virtual ~Stream(){}
};//主體類
class FileStream : public Stream {
public:virtual char Read(int number) {//讀文件流}virtual void Seek(int position) {//定位文件流}virtual void Write(char data) {//寫文件流}};class NetworkStream : public Stream {
public:virtual char Read(int number) {//讀網(wǎng)絡(luò)流}virtual void Seek(int position) {//定位網(wǎng)絡(luò)流}virtual void Write(char data) {//寫網(wǎng)絡(luò)流}
};class MemoryStream : public Stream {
public:virtual char Read(int number) {//讀內(nèi)存流}virtual void Seek(int position) {//定位內(nèi)存流}virtual void Write(char data) {//寫內(nèi)存流}
};//擴(kuò)展操作
DecoratorStream : public Stream {
protected:Stream* stream; //...DecoratorStream(Stream * stm) : stream(stm) {}
};class CryptoStream : public DecoratorStream {
public:CryptoStream(Stream* stm):DecoratorStream(stm) {}virtual char Read(int number) { //額外的加密操作...stream->Read(number); //讀文件流}virtual void Seek(int position) {//額外的加密操作...stream::Seek(position); //定位文件流//額外的加密操作...}virtual void Write(byte data) {//額外的加密操作...stream::Write(data); //寫文件流//額外的加密操作...}
};class BufferedStream : public DecoratorStream{Stream* stream; //...
public:BufferedStream(Stream* stm):DecoratorStream(stm) { }//...
};void Process(){//運(yùn)行時裝配FileStream* s1 = new FileStream();CryptoStream* s2 = new CryptoStream(s1);BufferedStream* s3 = new BufferedStream(s1); BufferedStream* s4 = new BufferedStream(s2);
}
? ????????圖


類圖
? ? ? ??
總結(jié)
????????通過采用組合而非繼承的手法, Decorator模式實現(xiàn)了在運(yùn)行時動態(tài)擴(kuò)展對象功能的能力,而且可以根據(jù)需要擴(kuò)展多個功能。避免了使用繼承帶來的 “靈活性差” 和 “多子類衍生問題”
????????Decorator類在接口上表現(xiàn)為is-a Component的繼承關(guān)系,即Decorator類繼承了Component類所具有的接口。但在實現(xiàn)上又表現(xiàn)為has-a Component的組合關(guān)系,即Decorator類又使用了另外一個Component類
????????Decorator模式的目的并非解決“多子類衍生的多繼承”問題,Decorator模式應(yīng)用的要點在于解決“主體類在多個方向上的擴(kuò)展功能”——是為“裝飾”的含義