• 设计模式读书笔记


    策略模式

    Strategy模式可以用来替换if else

    class TaxStrategy{
    public:
        virtual double Calculate(const Context & context) = 0;
        virtual ~TaxStrategy(){}
    };
    class SalesOrder{
    private:
        TaxStrategy* strategy;
    public:
        SalesOrder(StrategyFactory* strategyFactory){
            this->strategy = strategyFactory->NewStrategy();
        }//其实这个是工厂模式
        ~SalesOrder(){
            delete this->strategy;
        }
        public double CalculateTax(){
            Context context();
            double val = 
            strategy->Calculate(context);
        }
    };
    

    观察者模式

    Observer/Event
    通知依赖关系
    所有的依赖对象都将得到通知ß

    class MainForm: public Form, public IProgress{
        TextBox * txtFilePath;
        TextBox* txtFileNumber;
        ProgressBar* progressBar;
    public:
        void Button1_Click(){
            string filePath = txtFilePath->getText();
            int number = atoi(txtFileNumber->getText().c_str());
            FileSplitter splitter(filePath, number);
            splitter.split();
        }
        virtual void DoProgress(float value){
            progressBar->setValue(value);
        };
    };
    class IProgress{
    public:
        virtual void DoProgress(float value) = 0;
        virtua ~IProgress(){};
    };//实现一个抽象的通知机制
    class FileSplitter{
        string m_filePath;
        int m_fileNumber;
        /*
        假设要加入一个通知,通知进度如何
        加入一个抽象通知机制
        */
        IProgress * m_iprogress;
    public:
        FileSplitter(const string & filePath, int fileNumber):m_filePath(filePath),m_fileNumber(fileNumber),m_iprogress(iprogress){}
        void split(){
            for(int i = 0 i < m_fileNumber; i ++){
                .....
            if(m_iprogress != nullptr){
                float progressValue = m_fileNumber;
                progressValue = (i + 1) / progressValue;
                m_iprogress->DoProgress(progressValue);
            }
            }
        }
    };
    

    工厂模式

    Factory Method
    对象创建模式
    绕开new,来避免对象创建过程中的紧耦合
    面向接口的编程
    new带来了细节依赖

    class MainForm:public Form{
    private:
        TextBox * txtFilePath;
        TextBox* txtFileNumber;
        ProgressBar* progressBar;
        splitterFactory * factory;
    public:
        MainForm(splitterFactory * factory){
            this->factory = factory;
        }
        void Button1_Click(){
            ISplitter * splitter =
            factory->CreateSplitter();
            splitter->split();
        }
    };
    class ISplitter{
    public:
        virtual void split() = 0;
        ~ISplitter(){};
    };
    //具体类
    class FileSplitter : public ISplitter{
    public:
        void split(){
    
        }
    };
    class BinarySplitter: public ISplitter{
    
    };
    class TxtSplitter : public ISplitter{
    
    };
    class videoSplitter: public ISplitter{
    
    };
    class SplitterFactory{
    public:
        virtual ISplitter * CreateSplitter() = 0;
        virtual ~SplitterFactory(){};
    };
    //具体工厂
    class BinarySplitterFactory: public SplitterFactory{
    public:
        virtual ISplitter * CreateSplitter(){
            return new BinarySplitter();
        }
    }
    

    抽象工厂

    Abstract Factory
    经常面对一些相互依赖的对象的创建工作
    提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”
    无需指定它们具体的类

    class IDBConnection{
    
    };
    class IDBCommand{
        
    };
    class IDataReader{
    
    };
    class IDBConnectionFactory{//工厂类
    public:
        virtual IDBConnection * CreateDBConnection() = 0;
    };
    class sqlConnectionFacory : public IDBConnectionFactory{//具体的工厂实现
    public:
        virtual IDBConnection * CreateDBConnection(){
            return new SqlConnection();
        }
    };
    class SqlConnection : public IDBConnection{
    
    };
    class sqlCommand: public IDBCommand{
    
    };
    class IDBCommandFactory{
    public:
        virtual IDBCommand * CreateDBCommand() = 0;
    };
    class sqlCommandFactory : public IDBCommandFactory{
    public:
        virtual IDBCommand * CreateDBCommand(){
            return new sqlCommand();
        }
    };
    class sqlReader : public IDataReader{
    
    };
    class IDBDataReaderFactory{
    public:
        virtual IDataReader * CreateDBReader()=0;
    };
    class sqlDataReaderFactory: public IDBDataReaderFactory{
    public:
        virtual IDataReader * CreateDBReader(){
            return new sqlReader();
        }
    };
    /*
    省去了对应的mysql,oracle
    */
    class EmployeeDAO{
        IDBConnectionFactory * dbConnectionFactory;
        IDBCommandFactory * dbCommandFactory;
        IDBDataReaderFactory * dbReaderFactory;
        //这几个对应的参数应该是同一类
    public:
        vector<EmployeeDO> GetEmployees(){
            IDBCConnection * connection = 
            dbConnectionFactory->CreateDBConnection();
            connection->ConnectionString = "...";
            IDBCommand * command = 
            dbCommandFactory->CreateCreateCommand();
    
            /*
            其他的也一样是对应的实现
            */
        }
    };
    //**********************************分割
    /*
    将三个合在一起
        IDBConnectionFactory * dbConnectionFactory;
        IDBCommandFactory * dbCommandFactory;
        IDBDataReaderFactory * dbReaderFactory;
    合成一个工厂
        IDBFactory 
    */
    

    Singleton 单例模式

    “对象性能”模式
    面向对象很好的解决了“抽象”的问题,但是必不可免地要付出一定的代价。
    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例
    才能确保它们的逻辑正确性,以及良好的效率

    class Singleton{
    private:
        Singleton();
        Singleton(const Singleton & other);
    public:
        static Singleton * getInstance();
        static Singleton * m_instance;
    };
    Singleton * Singleton::m_instance=nullptr;
    //线程非安全版本 单线程可行
    Singleton * Singleton::getInstance(){
        /*
        假设存在两个线程 prthead_A, prthead_B
        A走到new这一步 , 时间片轮转到B这一步
        然后就并发了
        */
        if(m_instance == nullptr){
            m_instance = new Singleton();
        }
        return m_instance;
    }
    //同步的懒汉模式 线程安全版本 互斥锁
    Singleton * Singletion::getInstance(){
        Lock lock;
        if(m_instance == nullptr){
            m_instance = new Singleton();
        }
        return m_instance;
    }
    //线程安全版本,但由于内存读写reorder不安全
    /*
    在cpu指令层次 new三次会被reorder
    乱序处理
    就是不按照 我们想象的三步来处理
    双重检查懒汉模式
    */
    Singleton * Singletion::getInstance(){
        if(m_instance == nullptr){
            Lock lock;
            if(m_instance == nullptr)
                m_instance = new Singleton();
        }
        return m_instance;
    }
    //C++ 11版本之后的跨平台实现(bolatile)
    std::atomic<Singleton*> Singleton::m_instance;
    std::mutex Singleton::m_mutex;
    Singleton * Singleton::getInstance(){
        Singleton * tmp = m_instance.load(std::memory_order_relaxed);
        std::atomic_thread_fence(std::memory_order_acquire);
        if(tmp == nullptr){
            st::lock_guard<std::mutex> lock(m_mutex);
            tmp = m_instance.load(std::memory_order_relaxed);
            if(tmp == nullptr){
                tmp = new Singletion;
                std::atomic_thread_fence(std::memory_order_release);
                m_instance.store(tmp, std::memory_order_relaxed);
            }
        }
        return tmp;ge
    }
    
    class Singleton1{//饿汉模式
    private:
        Singleton1();
        Singleton1(const Singleton & other);
        static Singleton1 * m_instance = new Singleton1();
    public:
        static Singleton1 * getInstance();
    };
    static Sigleton1 Sigleton1::getInstance(){
        return m_instance;
    }
    
  • 相关阅读:
    js的this几种用法
    JS 事件绑定的几种方式 小笔记
    rem和em和px vh vw和% 移动端长度单位
    js 判断字符串中是否有某字符串
    angular2中的DOM操作之如何使input获取焦点
    angular2模板绑定样式
    论vw单位的实用性
    谷歌浏览器关闭同源策略方法
    video字幕无法显示,video视频在google中无法控制快进
    video视频铺满
  • 原文地址:https://www.cnblogs.com/qq136155330/p/12667806.html
Copyright © 2020-2023  润新知