zoukankan      html  css  js  c++  java
  • 装饰模式

    当存在部分子类共有的成员,但直接提到基类又不必要的情况下。使用装饰模式将那部分共有成员独立出来成为装饰类,包含这些部分共有的成员,需要这些成员的继承自该装饰类,不需要的直接继承基类。
    base.h

    #pragma  once
    
    class IStream
    {
    public:
    	virtual void Read(int num) = 0;
    	virtual void Seek(int pos) = 0;
    	virtual void Write(char data) = 0;
    	virtual ~IStream(){}
    };
    

    imp.h

    #pragma once
    
    #include "base.h"
    
    ////////////////////////////////
    class CFileStream:public IStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CFileStream(){}
    };
    
    class CNetStream:public IStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CNetStream(){}
    };
    
    class CMemStream:public IStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CMemStream(){}
    };
    #if 0
    //////////////////////////////////////////
    class CryptoFileStream:public CFileStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoFileStream(){}
    };
    
    class CryptoNetStream:public CNetStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoNetStream(){}
    };
    
    class CryptoMemStream:public CMemStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoMemStream(){}
    };
    
    //////////////////////////////////////////
    class CFileBufferStream:public CFileStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CFileBufferStream(){}
    };
    
    class CNetBufferStream:public CNetStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CNetBufferStream(){}
    };
    
    class CMemBufferStream:public CMemStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CMemBufferStream(){}
    };
    
    //////////////////////////////////////////
    class CryptoFileBufferStream:public CFileStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoFileBufferStream(){}
    };
    
    class CryptoNetBufferStream:public CFileStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoNetBufferStream(){}
    };
    
    class CryptoMemBufferStream:public CFileStream
    {
    public:
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoMemBufferStream(){}
    };
    #else
    
    /*
    1.通过将使用组合而非继承将stream实际类型在运行时确定,
    达到在编译时CryptoStream,CBufferStream,CryptoBufferStream都是稳定的。
    2.IStream使用组合后,理论上CryptoStream,CBufferStream,CryptoBufferStream
    可以不再继承IStream,但是为接口规范,IStream定义子类接口标准,子类必须签名一致。
    3.IStream本身是既被CFileStream等继承
    又被CryptoStream,CBufferStream,CryptoBufferStream等继承
    但是又不能直接提到IStream基类中,故使用装饰模式,创造一个中间类。
    */
    class CDecoratorStream:public IStream
    {
    protected:
    	IStream* m_stream;
    	CDecoratorStream(IStream* stm):m_stream(stm){}
    };
    
    
    class CryptoStream:public CDecoratorStream
    {
    public:
    	CryptoStream(IStream* stm):CDecoratorStream(stm){}
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoStream(){}
    };
    
    class CBufferStream:public CDecoratorStream
    {
    public:
    	CBufferStream(IStream* stm):CDecoratorStream(stm){}
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CBufferStream(){}
    };
    
    
    class CryptoBufferStream:public CDecoratorStream
    {
    public:
    	CryptoBufferStream(IStream* stm):CDecoratorStream(stm){}
    	virtual void Read(int num);
    	virtual void Seek(int pos);
    	virtual void Write(char data);
    	virtual ~CryptoBufferStream(){}
    };
    #endif
    

    imp.cpp

    #include <iostream>
    #include "imp.h"
    
    using namespace std;
    
    void CFileStream::Read(int num)
    {
    	cout << "CFileStream Read" << endl;
    }
    void CFileStream::Seek(int pos)
    {
    	cout << "CFileStream Seek" << endl;
    }
    void CFileStream::Write(char data)
    {
    	cout << "CFileStream Write" << endl;
    }
    
    void CNetStream::Read(int num)
    {
    	cout << "CNetStream Read" << endl;
    }
    void CNetStream::Seek(int pos)
    {
    	cout << "CNetStream Seek" << endl;
    }
    void CNetStream::Write(char data)
    {
    	cout << "CNetStream Write" << endl;
    }
    
    void CMemStream::Read(int num)
    {
    	cout << "CMemStream Read" << endl;
    }
    void CMemStream::Seek(int pos)
    {
    	cout << "CMemStream Seek" << endl;
    }
    void CMemStream::Write(char data)
    {
    	cout << "CMemStream Write" << endl;
    }
    ///////////////////////////////////////////
    void CryptoStream::Read(int num)
    {
    	m_stream->Read(num);
    	cout << "CryptoStream Read" << endl;
    }
    void CryptoStream::Seek(int pos)
    {
    	m_stream->Seek(pos);
    	cout << "CryptoStream Seek" << endl;
    }
    void CryptoStream::Write(char data)
    {
    	m_stream->Write(data);
    	cout << "CryptoStream Write" << endl;
    }
    ////////////////////////////////////////////
    void CBufferStream::Read(int num)
    {
    	m_stream->Read(num);
    	cout << "CBufferStream Read" << endl;
    }
    void CBufferStream::Seek(int pos)
    {
    	m_stream->Seek(pos);
    	cout << "CBufferStream Seek" << endl;
    }
    void CBufferStream::Write(char data)
    {
    	m_stream->Write(data);
    	cout << "CBufferStream Write" << endl;
    }
    /////////////////////////////////////////////
    void CryptoBufferStream::Read(int num)
    {
    	m_stream->Read(num);
    	cout << "CryptoBufferStream Read" << endl;
    }
    void CryptoBufferStream::Seek(int pos)
    {
    	m_stream->Seek(pos);
    	cout << "CryptoBufferStream Seek" << endl;
    }
    void CryptoBufferStream::Write(char data)
    {
    	m_stream->Write(data);
    	cout << "CryptoBufferStream Write" << endl;
    }
    

    main.cpp

    #include "base.h"
    #include "imp.h"
    
    int main()
    {
    	CFileStream fileStream;
    	CBufferStream bufStream(&fileStream);
    	bufStream.Read(5);
    	
    	CNetStream netStream;
    	CryptoStream cryptoStream(&netStream);
    	cryptoStream.Seek(10);
    	
    	CMemStream menStream;
    	CryptoBufferStream cryptoBufStream(&menStream);
    	cryptoBufStream.Write('x');
    	
    	return 0;
    }
    
  • 相关阅读:
    Java jni字符串转换
    Python读取PE文件(exe/dll)中的时间戳
    深度学习word embedding猜测性别初探
    闪存内容汇编(截止20170405)
    如何自动化安装字体(命令行批量)
    如何分析进程的内存占用问题
    Python print报ascii编码异常的靠谱解决办法
    Linux界面自动化测试框架不完全汇总
    Qt实现同步(阻塞式)http get等网络访问操作
    基于第三方开源库的OPC服务器开发指南(4)——后记:与另一个开源库opc workshop库相关的问题
  • 原文地址:https://www.cnblogs.com/kuikuitage/p/10995665.html
Copyright © 2011-2022 走看看