设计模式 第二周 博览网

对象创建模式

设计模式 第二周 博览网_第1张图片
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();

    }
};
设计模式 第二周 博览网_第2张图片
image

设计模式 第二周 博览网_第3张图片
image

设计模式 第二周 博览网_第4张图片
image

设计模式 第二周 博览网_第5张图片
image

设计模式 第二周 博览网_第6张图片
image

原始程序

/*数据库管理程序*/
class EmployeeDAO{
    
public:
    vector 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 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 GetEmployees(){
        IDBConnection* connection =
            dbFactory->CreateDBConnection();
        connection->ConnectionString("...");

        IDBCommand* command =
            dbFactory->CreateDBCommand();
        command->CommandText("...");
        command->SetConnection(connection); //关联性

        IDBDataReader* reader = command->ExecuteReader(); //关联性
        while (reader->Read()){

        }

    }
};

设计模式 第二周 博览网_第7张图片
image

设计模式 第二周 博览网_第8张图片
image

设计模式 第二周 博览网_第9张图片
image

设计模式 第二周 博览网_第10张图片
image

设计模式 第二周 博览网_第11张图片
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();
    }
};
设计模式 第二周 博览网_第12张图片
image

设计模式 第二周 博览网_第13张图片
image

设计模式 第二周 博览网_第14张图片
image

设计模式 第二周 博览网_第15张图片
image

设计模式 第二周 博览网_第16张图片
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();
    }
};







设计模式 第二周 博览网_第17张图片
image

设计模式 第二周 博览网_第18张图片
image

设计模式 第二周 博览网_第19张图片
image

设计模式 第二周 博览网_第20张图片
image

设计模式 第二周 博览网_第21张图片
image

Facade 门面模式

设计模式 第二周 博览网_第22张图片
image
设计模式 第二周 博览网_第23张图片
image

设计模式 第二周 博览网_第24张图片
image

设计模式 第二周 博览网_第25张图片
image

设计模式 第二周 博览网_第26张图片
image

设计模式 第二周 博览网_第27张图片
image

Proxy 代理模式

设计模式 第二周 博览网_第28张图片
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();
        
        //....
    }
};
设计模式 第二周 博览网_第29张图片
image

设计模式 第二周 博览网_第30张图片
image

设计模式 第二周 博览网_第31张图片
image

设计模式 第二周 博览网_第32张图片
image

Adapter适配器

设计模式 第二周 博览网_第33张图片
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;
    
};
设计模式 第二周 博览网_第34张图片
image

设计模式 第二周 博览网_第35张图片
image

设计模式 第二周 博览网_第36张图片
image

设计模式 第二周 博览网_第37张图片
image

Mediator 中介者

设计模式 第二周 博览网_第38张图片
image

设计模式 第二周 博览网_第39张图片
image

设计模式 第二周 博览网_第40张图片
image

设计模式 第二周 博览网_第41张图片
image

设计模式 第二周 博览网_第42张图片
image

你可能感兴趣的:(设计模式 第二周 博览网)