美文网首页
设计模式 第二周 博览网

设计模式 第二周 博览网

作者: 我要飞翔_2520 | 来源:发表于2017-07-02 12:29 被阅读0次

    对象创建模式

    image

    工厂模式

    image

    原始程序

    /*文件分割程序*/
    class ISplitter{
    public:
        virtual void split()=0;
        virtual ~ISplitter(){}
    };
    
    class BinarySplitter : public ISplitter{
        
    };
    
    class TxtSplitter: public ISplitter{
        
    };
    
    class PictureSplitter: public ISplitter{
        
    };
    
    class VideoSplitter: public ISplitter{
        
    };
    
    //文件分割
    class MainForm : public Form
    {
        TextBox* txtFilePath;
        TextBox* txtFileNumber;
        ProgressBar* progressBar;
    
    public:
        void Button1_Click(){
            ISplitter * splitter=
                new BinarySplitter();//依赖具体类,细节依赖
            splitter->split();
        }
    };
    

    重构程序

    
    //抽象类
    class ISplitter{
    public:
        virtual void split()=0;
        virtual ~ISplitter(){}
    };
    
    
    //工厂基类
    class SplitterFactory{
    public:
        virtual ISplitter* CreateSplitter()=0;
        virtual ~SplitterFactory(){}
    };
    
    
    
    //具体类
    class BinarySplitter : public ISplitter{
        
    };
    
    class TxtSplitter: public ISplitter{
        
    };
    
    class PictureSplitter: public ISplitter{
        
    };
    
    class VideoSplitter: public ISplitter{
        
    };
    
    //具体工厂
    class BinarySplitterFactory: public SplitterFactory{
    public:
        virtual ISplitter* CreateSplitter(){
            return new BinarySplitter();
        }
    };
    
    class TxtSplitterFactory: public SplitterFactory{
    public:
        virtual ISplitter* CreateSplitter(){
            return new TxtSplitter();
        }
    };
    
    class PictureSplitterFactory: public SplitterFactory{
    public:
        virtual ISplitter* CreateSplitter(){
            return new PictureSplitter();
        }
    };
    
    class VideoSplitterFactory: public SplitterFactory{
    public:
        virtual ISplitter* CreateSplitter(){
            return new VideoSplitter();
        }
    };
    
    //改良后mainform不依赖任何具体类。
    //具体产生什么工厂mainform不负责,由别人传入给它的参数来决定
    class MainForm : public Form
    {
        SplitterFactory*  factory;//工厂,工厂可以选择
    
    public:
    
        MainForm(SplitterFactory*  factory){
            this->factory=factory;
        }
    
        void Button1_Click(){
    
    
            ISplitter * splitter=
                factory->CreateSplitter(); //多态new
    
            splitter->split();
    
        }
    };
    
    image
    image
    image
    image
    image

    原始程序

    /*数据库管理程序*/
    class EmployeeDAO{
        
    public:
        vector<EmployeeDO> GetEmployees(){
            SqlConnection* connection =
                new SqlConnection();
            connection->ConnectionString = "...";
    
            SqlCommand* command =
                new SqlCommand();
            command->CommandText="...";
            command->SetConnection(connection);
    
            SqlDataReader* reader = command->ExecuteReader();
            while (reader->Read()){
    
            }
    
        }
    };
    
    

    重构程序1

    
    //数据库访问有关的基类
    class IDBConnection{
    
    };
    class IDBConnectionFactory{
    public:
        virtual IDBConnection* CreateDBConnection()=0;
    };
    
    
    class IDBCommand{
    
    };
    class IDBCommandFactory{
    public:
        virtual IDBCommand* CreateDBCommand()=0;
    };
    
    
    class IDataReader{
    
    };
    class IDataReaderFactory{
    public:
        virtual IDataReader* CreateDataReader()=0;
    };
    
    
    //支持SQL Server
    class SqlConnection: public IDBConnection{
    
    };
    class SqlConnectionFactory:public IDBConnectionFactory{
    
    };
    
    
    class SqlCommand: public IDBCommand{
    
    };
    class SqlCommandFactory:public IDBCommandFactory{
    
    };
    
    
    class SqlDataReader: public IDataReader{
    
    };
    class SqlDataReaderFactory:public IDataReaderFactory{
    
    };
    
    //支持Oracle
    class OracleConnection: public IDBConnection{
    
    };
    
    class OracleCommand: public IDBCommand{
    
    };
    
    class OracleDataReader: public IDataReader{
    
    };
    
    
    
    class EmployeeDAO{
        IDBConnectionFactory* dbConnectionFactory;//可能传入SQL
        IDBCommandFactory* dbCommandFactory;//可能传入Oracle
        IDataReaderFactory* dataReaderFactory;//它们三个必须是同一系列的。所有就有了abstract factory模式
        //因此需要将这三个合成同一个工厂,以保证关联性
    
    public:
        vector<EmployeeDO> GetEmployees(){
            IDBConnection* connection =
                dbConnectionFactory->CreateDBConnection();
            connection->ConnectionString("...");
    
            IDBCommand* command =
                dbCommandFactory->CreateDBCommand();
            command->CommandText("...");
            command->SetConnection(connection); //关联性
    
            IDBDataReader* reader = command->ExecuteReader(); //关联性
            while (reader->Read()){
    
            }
    
        }
    };
    
    

    重构程序2

    
    //数据库访问有关的基类
    class IDBConnection{
    
    };
    
    class IDBCommand{
    
    };
    
    class IDataReader{
    
    };
    
    
    class IDBFactory{
    public:
        virtual IDBConnection* CreateDBConnection()=0;
        virtual IDBCommand* CreateDBCommand()=0;
        virtual IDataReader* CreateDataReader()=0;
    
    };
    
    
    //支持SQL Server
    class SqlConnection: public IDBConnection{
    
    };
    class SqlCommand: public IDBCommand{
    
    };
    class SqlDataReader: public IDataReader{
    
    };
    
    
    class SqlDBFactory:public IDBFactory{
    public:
        virtual IDBConnection* CreateDBConnection();
        virtual IDBCommand* CreateDBCommand();
        virtual IDataReader* CreateDataReader();
    
    };
    
    //支持Oracle
    class OracleConnection: public IDBConnection{
    
    };
    
    class OracleCommand: public IDBCommand{
    
    };
    
    class OracleDataReader: public IDataReader{
    
    };
    
    
    
    class EmployeeDAO{
        IDBFactory* dbFactory;
    
    public:
        vector<EmployeeDO> GetEmployees(){
            IDBConnection* connection =
                dbFactory->CreateDBConnection();
            connection->ConnectionString("...");
    
            IDBCommand* command =
                dbFactory->CreateDBCommand();
            command->CommandText("...");
            command->SetConnection(connection); //关联性
    
            IDBDataReader* reader = command->ExecuteReader(); //关联性
            while (reader->Read()){
    
            }
    
        }
    };
    
    
    image
    image
    image
    image
    image

    模型实现

    /*文件分割程序*/
    //抽象类
    class ISplitter{
    public:
        virtual void split()=0;
        virtual ISplitter* clone()=0; //通过克隆自己来创建对象
        
        virtual ~ISplitter(){}
    
    };
    
    
    //具体类
    class BinarySplitter : public ISplitter{
    public:
        virtual ISplitter* clone(){
            return new BinarySplitter(*this);
        }
    };
    
    class TxtSplitter: public ISplitter{
    public:
        virtual ISplitter* clone(){
            return new TxtSplitter(*this);
        }
    };
    
    class PictureSplitter: public ISplitter{
    public:
        virtual ISplitter* clone(){
            return new PictureSplitter(*this);
        }
    };
    
    class VideoSplitter: public ISplitter{
    public:
        virtual ISplitter* clone(){
            return new VideoSplitter(*this);
        }
    };
    
    //客户端程序
    class MainForm : public Form
    {
        ISplitter*  prototype;//原型对象
    
    public:
    
        MainForm(ISplitter*  prototype){  //通过向MainForm传递具体类来创建具体类
            this->prototype=prototype;
        }
    
        void Button1_Click(){
    
            ISplitter * splitter=
                prototype->clone(); //克隆原型
    
            splitter->split();
        }
    };
    
    image
    image
    image
    image
    image

    模型实现

    //类似模板模式
    class House{
        //....
    };
    
    class HouseBuilder {
    public:
        House* GetResult(){
            return pHouse;
        }
        virtual ~HouseBuilder(){}
    protected:
        
        House* pHouse;
        virtual void BuildPart1()=0;
        virtual void BuildPart2()=0;
        virtual void BuildPart3()=0;
        virtual void BuildPart4()=0;
        virtual void BuildPart5()=0;
        
    };
    
    class StoneHouse: public House{
        
    };
    
    class StoneHouseBuilder: public HouseBuilder{
    protected:
        
        virtual void BuildPart1(){
            //pHouse->Part1 = ...;
        }
        virtual void BuildPart2(){
            
        }
        virtual void BuildPart3(){
            
        }
        virtual void BuildPart4(){
            
        }
        virtual void BuildPart5(){
            
        }
        
    };
    
    
    class HouseDirector{
        
    public:
        HouseBuilder* pHouseBuilder;
        
        HouseDirector(HouseBuilder* pHouseBuilder){
            this->pHouseBuilder=pHouseBuilder;
        }
        
        House* Construct(){
            
            pHouseBuilder->BuildPart1();
            
            for (int i = 0; i < 4; i++){
                pHouseBuilder->BuildPart2();
            }
            
            bool flag=pHouseBuilder->BuildPart3();
            
            if(flag){
                pHouseBuilder->BuildPart4();
            }
            
            pHouseBuilder->BuildPart5();
            
            return pHouseBuilder->GetResult();
        }
    };
    
    
    
    
    
    
    
    
    image
    image
    image
    image
    image

    Facade 门面模式

    image image
    image
    image
    image
    image

    Proxy 代理模式

    image

    原始程序

    class ISubject{
    public:
        virtual void process();
    };
    
    
    class RealSubject: public ISubject{
    public:
        virtual void process(){
            //....
        }
    };
    
    class ClientApp{
        
        ISubject* subject;
        
    public:
        
        ClientApp(){
            subject=new RealSubject();
        }
        
        void DoTask(){
            //...
            subject->process();
            
            //....
        }
    };
    

    重构程序

    class ISubject{
    public:
        virtual void process();
    };
    
    
    //Proxy的设计
    class SubjectProxy: public ISubject{
        
        
    public:
        virtual void process(){
            //对RealSubject的一种间接访问
            //....
        }
    };
    
    class ClientApp{
        
        ISubject* subject;
        
    public:
        
        ClientApp(){
            subject=new SubjectProxy();
        }
        
        void DoTask(){
            //...
            subject->process();
            
            //....
        }
    };
    
    image
    image
    image
    image

    Adapter适配器

    image

    模式实例

    //目标接口(新接口)
    class ITarget{
    public:
        virtual void process()=0;
    };
    
    //遗留接口(老接口)
    class IAdaptee{
    public:
        virtual void foo(int data)=0;
        virtual int bar()=0;
    };
    
    //遗留类型
    class OldClass: public IAdaptee{
        //....
    };
    
    //对象适配器
    class Adapter: public ITarget{ //继承
    protected:
        IAdaptee* pAdaptee;//组合
        
    public:
        
        Adapter(IAdaptee* pAdaptee){
            this->pAdaptee=pAdaptee;
        }
        
        virtual void process(){
            int data=pAdaptee->bar();
            pAdaptee->foo(data);
        }
    };
    
    //类适配器
    class Adapter: public ITarget,
                   protected OldClass{ //多继承
    }
    
    int main(){
        IAdaptee* pAdaptee=new OldClass();
        
        
        ITarget* pTarget=new Adapter(pAdaptee);
        pTarget->process();
    }
    
    
    class stack{
        deqeue container;
        
    };
    
    class queue{
        deqeue container;
        
    };
    
    image
    image
    image
    image

    Mediator 中介者

    image
    image
    image
    image
    image

    相关文章

      网友评论

          本文标题:设计模式 第二周 博览网

          本文链接:https://www.haomeiwen.com/subject/kbmncxtx.html