天天看點

裝飾模式

“單一職責”模式:

在軟體元件的設計中,如果責任劃分的不清晰,使用繼承得到的結果往往是随着需求的變化,子類急劇膨脹,同時充斥着重複代碼,這時候的關鍵是劃清責任。

典型模式

.Decorator

.Bridge

1.Decorator模式

裝飾模式
代碼1:

//業務操作
class Stream{
    virtual char Read(int number) = 0;
    virtual char Seek(int position) = 0;
    virtual char Write(int data) = 0;

    virtual ~Stream(){}
};

//主類體
class FileStream :public Stream{
public:
    virtual char Read(int number){
        //讀檔案流
    }
    virtual char Seek(int position){
        //定位檔案流
    }
    virtual char Write(int data){
        //寫檔案流
    }
};

class NetworkStream :public Stream{
public:
    virtual char Read(int number){
        //讀檔案流
    }
    virtual char Seek(int position){
        //定位網絡流
    }
    virtual char Write(int data){
        //寫檔案流
    }
};

class MemoryStream :public Stream{
public:
    virtual char Read(int number){
        //讀檔案流
    }
    virtual char Seek(int position){
        //定位記憶體流
    }
    virtual char Write(int data){
        //寫檔案流
    }
};

//擴充操作
class CryptoFileStream :public FileStream{
public:
    virtual char Read(int number){

        //額外的加密操作....
        FileStream::Read(number);//讀檔案流
    }
    virtual char Seek(int position){ 

        //額外的加密操作....
        FileStream::Seek(position);//定位檔案流
        //額外的加密操作....
    }
    virtual char Write(int data){
        
        //額外的加密操作....
        FileStream::Write(data);//寫檔案流
        //額外的加密操作....
    }
};

class BufferedFileSyream :public FileStream{
    //...
};

class BufferedNetWorkStream :public NetworkStream{

};

class BufferedMemoryStream : public MemoryStream{

};

class CryptoBuffedFileStream :public FileStream{
public:
    virtual char Read(int number){
        //額外的加密操作
        //額外的緩沖操作
        FileStream::Read(number);//讀檔案流
    }
    virtual char Seek(int position){ 
        //額外的加密操作
        //額外的緩沖操作
        FileStream::Seek(position);//定位記憶體流
    }
    virtual char Write(int data){ 
        //額外的加密操作
        //額外的緩沖操作
        FileStream::Write(data);//寫檔案流
    }
};

void Process()
{
    //編譯時裝配
    CryptoFileStream* fs1 = new CryptoFileStream;
    BufferedFileSyream *fs2 = new BufferedFileSyream;
    CryptoBuffedFileStream* fs3 = new CryptoBuffedFileStream;

}      

該代碼有什麼問題?

備援度太高!

示意圖:

裝飾模式

該類的規模有多少?

1+n+n*m!/2

很明顯,規模太大,在之後的維護中會占很大的時間

是以,為了消除備援,使用裝飾模型來修改上面的代碼

代碼2:

//業務操作
class Stream{
    virtual char Read(int number) = 0;
    virtual char Seek(int position) = 0;
    virtual char Write(int data) = 0;

    virtual ~Stream(){}
};

//主類體
class FileStream :public Stream{
public:
    virtual char Read(int number){
        //讀檔案流
    }
    virtual char Seek(int position){
        //定位檔案流
    }
    virtual char Write(int data){
        //寫檔案流
    }
};

class NetworkStream :public Stream{
public:
    virtual char Read(int number){
        //讀檔案流
    }
    virtual char Seek(int position){
        //定位網絡流
    }
    virtual char Write(int data){
        //寫檔案流
    }
};

class MemoryStream :public Stream{
public:
    virtual char Read(int number){
        //讀檔案流
    }
    virtual char Seek(int position){
        //定位記憶體流
    }
    virtual char Write(int data){
        //寫檔案流
    }
};

//擴充操作
//當一個變量的聲明類型都是某個類型的子類時候,那麼把他聲明為某個類型就可以了
class DecoratorStream:public Stream{
protected:
    Stream* stream;
    DecoratorStream(Stream stm) :stream(stm){    //構造器

    }
}

class CryptoStream :public DecoratorStream{
public:
    CryptoStream(Stream stm) :stream(stm){    //構造器

    }


    virtual char Read(int number){

        //額外的加密操作....
        stream->Read(number);//讀檔案流
    }
    virtual char Seek(int position){

        //額外的加密操作....
        stream->Seek(position);//定位檔案流
        //額外的加密操作....
    }
    virtual char Write(int data){

        //額外的加密操作....
        stream->Write(data);//寫檔案流
        //額外的加密操作....
    }
};

class BufferedSyream :public DecoratorStream{

    //...
public:
    BufferedSyream(Stream stm) :stream(stm){    //構造器

    }
};


class CryptoBuffedFileStream :public FileStream{
public:
    virtual char Read(int number){
        //額外的加密操作
        //額外的緩沖操作
        FileStream::Read(number);//讀檔案流
    }
    virtual char Seek(int position){
        //額外的加密操作
        //額外的緩沖操作
        FileStream::Seek(position);//定位記憶體流
    }
    virtual char Write(int data){
        //額外的加密操作
        //額外的緩沖操作
        FileStream::Write(data);//寫檔案流
    }
};

void Process()
{
    //編譯時裝配
    FileStream* s1 = new FileStream();
    CryptoStream* s2 = new CryptoStream(s1);
    BufferedSyream* s3 = new BufferedSyream(s1);
    BufferedSyream* s4 = new BufferedSyream(s2);
}      
裝飾模式

代碼的規模為:1+n+1+m

已經達到了要求!

裝飾模式