• 设计模式(7)模板(从事务处理应用的模板)


    首先看一个对于数据库操作的程序:

    #include <iostream>
    
    using namespace std;
    
    class DataOper{
    public: 
    	void insertStu(){
    		cout<<"开连接..."<<endl;
    		cout<<"开启事务..."<<endl;
    		cout<<"执行insert()操作"<<endl;
    		cout<<"提交事务..."<<endl;
    		cout<<"关连接..."<<endl;
    	}
    
    	void updateStu(){
    		cout<<"开连接..."<<endl;
    		cout<<"开启事务..."<<endl;
    		cout<<"执行update()操作"<<endl;
    		cout<<"提交事务..."<<endl;
    		cout<<"关连接..."<<endl;
    	}
    
    	void deleteStu(){
    		cout<<"开连接..."<<endl;
    		cout<<"开启事务..."<<endl;
    		cout<<"执行delete()操作"<<endl;
    		cout<<"提交事务..."<<endl;
    		cout<<"关连接..."<<endl;
    	}
    };
    
    void main(){
    	DataOper* dataOper = new DataOper();
    	dataOper->insertStu();
    	dataOper->updateStu();
    	dataOper->deleteStu();
    }
    

    我们看运行结果有多个重复的操作

    如何避免呢,就是使用模板把我们不需要重复操作的地方封装起来。

    看一下新版代码:

    #include <iostream>
    
    using namespace std;
    
    class DataTemplate{
    private:
    	void beginConnection(){
    		cout<<"开连接..."<<endl;
    	}
    	void beginTransation(){
    		cout<<"开启事务..."<<endl;
    	}
    	void commitTransation(){
    		cout<<"提交事务..."<<endl;
    	}
    	void closeConnection(){
    		cout<<"关连接..."<<endl;
    	}
    public:
    	
    	virtual void insertData() = 0;
    	virtual void updateData() = 0;
    	virtual void deleteData() = 0;
    	
    	void insertStu(){
    		beginConnection();
    		beginTransation();
    		insertData();
    		commitTransation();
    		closeConnection();
    	}
    	
    	void updateStu(){
    		beginConnection();
    		beginTransation();
    		updateData();
    		commitTransation();
    		closeConnection();
    	}
    	
    	void deleteStu(){
    		beginConnection();
    		beginTransation();
    		deleteData();
    		commitTransation();
    		closeConnection();
    	}
    };
    
    class DataDeal : public DataTemplate{
    public:
    	virtual void insertData(){
    		cout<<"执行insert()操作"<<endl;
    	}
    	virtual void updateData(){
    		cout<<"执行update()操作"<<endl;
    	}
    	virtual void deleteData(){
    		cout<<"执行delete()操作"<<endl;
    	}
    };
    
    void main(){
    	DataDeal* dataDeal = new DataDeal();
    	dataDeal->insertStu();
    	dataDeal->updateStu();
    	dataDeal->deleteStu();
    }
    

    执行一下结果:

    结果相同,但是看看我们的类里少了很多处理程序,我们只需要关心我们要处理的业务逻辑就可以了。

    模板方法的效用一:节省子类代码。

    这样,如果我们在父类把方法全部abstract,那么我们就没有做到减少子类代码的作用。

    因此,写模板方法很容易,但是写一个好的模板方法就没那么容易了。

    我们要做到良好的抽取,把固定的实现方法放在父类方法中去实现。

    模板方法效用二:防止调用操作

    在很多关于设计模式的书上,都是把父类的模板方法换成了一个简单的方法的堆积,如Display**1,Display*2等等。这样就给很多读者造成了一种错觉,觉得模板方法就是去调用下面的方法,其实并不尽然。

    后面会继续谈到与其它模式的运用组合。

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    linux
    day01-02
    测试基础
    cookie session
    多表表与表关系 增删改查 admin
    连接数据库 创建表 字段和参数 增删改查
    LeetCode OJ:Triangle(三角形)
    LeetCode OJ:Unique Paths II(唯一路径II)
    LeetCode OJ:Unique Paths(唯一路径)
    使用双栈实现一个队列
  • 原文地址:https://www.cnblogs.com/skyme/p/2020018.html
Copyright © 2020-2023  润新知