设计模式学习一:组件协作

从封装角度对设计模式分类,

一:组件协作

组件协作模式通过晚绑定来实现框架与应用程序的松耦合,很好的应对变化
1:模板方法(Template Method)

//没有采用设计模式的类设计:
(1):
//程序库开发人员写的
class Library
{
public:
        void step1()
        {
             //...
        }
        void step3()
        {
            //...
        }
        
        void step5()
        {
            //...
        }
};
(2):
//应用程序开发人员写的
class Application
{
public:
        void step2()
        {
            //...
        }
        void step4()
        {
            //...
        }
};
int main()
{
    Application app();
    Library lib();
    
    lib.step1();
    
    if(app.step2())
    {
        lib.step3();
    }
    for(int i = 0; i < 4; i++)
    {
        app.step4();
    }
    lib.step5();
    
}

(1)是先前早写好的,(2)是后来开发人员写的。它俩之间的关系是(2)调用(1),属于早绑定。

//采用设计模式的类设计:
(1):
//程序库开发人员写的
class Library
{
public:
    void Run()
    {
        lib.step1();
    
        if(app.step2()) //支持变化--->虚函数的多态调用
        {
            lib.step3();
        }
        for(int i = 0; i < 4; i++)
        {
            app.step4();//支持变化--->虚函数的多态调用
        }
        lib.step5();
    }
    //基类的析构函数成虚函数,以防子类析构函数无法被调用
    virtual ~Library() { }
protected:
    step1()
    {
        //...稳定
    }
    step3()
    {
        //...稳定
    }
    step5()
    {
        //....稳定
    }
};
//纯虚函数,实现由子类来完成,支持子类的变化
virtual bool step2() = 0;
virtual void step4() = 0;
(2):
//应用程序开发人员写的
class Application
{
protected:
    bool step2()
    {
        //....重写虚函数
    }
    void step4()
    {
        //...重写虚函数
    }
};
int main()
{
    //多态指针,声明类型为Library,实际类型为Application
    Library *lib = new Application();
    lib.Run();
    
    delete lib;
}

(1)调用(2),属于晚绑定。

 

posted @ 2018-03-22 11:02  FocusA  阅读(392)  评论(0)    收藏  举报