小工具知识网

当前位置: 首页 > 行业知识 > 音视频学习笔记——设计模式

行业知识

音视频学习笔记——设计模式

2026-11-12 18:23:26 来源:互联网转载

✊✊✊大家好!���篇文章主要记录自己在进行音视频学习中,整理的包括单例模式、工厂模式、策略模式、观察者模式等6种相关的设计模式和4种准则的内容重点。

音视频学习笔记——设计模式


本专栏知识点是通过的音视频流媒体高级开发课程进行系统学习,按照学习重点梳理总结后写下文章,对音视频相关内容感兴趣的读者,可以点击观看课程网址:零声教育


导航小助手

  • 音视频学习笔记——设计模式
    • 1.单例模式
    • 2.简单工厂模式
    • 3.策略模式
    • 4.观察者模式
    • 5.组合模式
    • 6.责任链模式
    • 7. 四个准则
      • 单一职责原则
      • 开放――封闭原则
      • 里氏代换原则
      • 依赖倒转原则
      • 8.总结

        1.单例模式

        保证一个类仅有一个实例,并提供一个访问它的全局访问点

        让类自身负责保护它的唯一实例,这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

        Singelton类,定义GetSingel操作,允许客户访问它的唯一实例。

        GetSingel为静态方法,主要负责创建自己的唯一实例。

        • 优点:Singleton类封装它的唯一实例,这样可以严格控制客户怎样访问它以及何时访问它。简单来说,对唯一实例的受控访问。

          示例代码:

          #include #include #include using namespace std;class Singelton{private:Singelton(){} //构造方法令其私有,堵***外界利用new创建此类实例的可能static Singelton* singel; public:static Singelton* GetSingel(){//此方法是获得本类实例的唯一全局访问点if(singel == NULL){  //若实例不存在,new一个实例,否则返回已有实例singel = new Singelton();}return singel;}};Singelton* Singelton::singel = NULL;//注意静态变量类外初始化

          客户端:

          int main(){Singelton* s1=Singelton::GetSingel();Singelton* s2=Singelton::GetSingel();if(s1 == s2)//两次实例化后对象结果是,实力相同,返回okcoutpublic:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult=0;return dResult;}};//加法类,继承基类class AddOperation : public COperation{public:virtual double GetResult(){return m_nFirst+m_nSecond;}};//减法类,继承基类class SubOperation : public COperation{public:virtual double GetResult(){return m_nFirst-m_nSecond;}};//工厂类class CCalculatorFactory{public:static COperation* Create(char cOperator);};COperation* CCalculatorFactory::Create(char cOperator){COperation *oper = NULL;//在 C# 中可以用反射来取消判断时用的 switch ,在 C++ 中用什么呢? RTTIswitch (cOperator){case '+':oper=new AddOperation();break;case '-':oper=new SubOperation();break;default:oper=new AddOperation();break;}return oper;}int a,b;cinab;COperation * op=CCalculatorFactory::Create('-');op-m_nFirst=a;op-m_nSecond=b;coutpublic:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult=0;return dResult;}};//AddOperation,封装了具体的算法或者行为,继承于COperation//策略具体类—加法类class AddOperation : public COperation{public:AddOperation(int a,int b){m_nFirst=a;m_nSecond=b;}virtual double GetResult(){return m_n First+m_nSecond;}};//策略具体类—减法类class SubOperation : public COperation{public:AddOperation(int a,int b){m_nFirst=a;m_nSecond=b;}virtual double GetResult(){return m_n First-m_nSecond;}};//Context,用Operation来进行配置,维护对temp对象的引用。class Context{private:COperation* op;//public:Context(COperation* temp){op=temp;}double GetResult(){return op-GetResult();}};int a,b;char c;cinab;cout>c;switch(c){case '+':Context * context =new Context(new AddOperation(a,b));coutGetResult()private:COperation* op = NULL;//声明一个op对象public:Context(char cType){ //参数一个字符,表示具体算法switch (cType){case '+':op=new AddOperation(3,8);break;case '-':op=new SubOperation(5,2);break;default:op=new AddOperation();break;}}//将实例化具体策略的过程由客户端转移到Context中,简单工厂的应用double GetResult(){return op-GetResult();}};int main(){char c;cinc;Context *test=new Context(c);//将输入字符'c'传给Context的对象中coutprivate:string name;Secretary* sub;public:StockObserver(string strname,Secretary* strsub){name=strname;sub=strsub;}void Update();};//秘书类(主题对象,通知者)class Secretary{private://同事列表vectorobservers.push_back(ob);}//通知void Notify(){vector(*p).Update();p++;};void StockObserver::Update(){coutSecretary *p=new Secretary(); // 创建通知者//观察者StockObserver *s1= new StockObserver("小李",p);StockObserver *s2 = new StockObserver("小赵",p);//加入通知队列p-Add(*s1);p-Add(*s2);//事件p-action="老板来了";//通知p-Notify();return 0;}protected:string name;SecretaryBase* sub;public:CObserverBase(string strname,SecretaryBase* strsub){name=strname;sub=strsub;}virtual void Update()=0;};public:StockObserver(string strname,SecretaryBase* strsub):CObserverBase(strname,strsub){}virtual void Update();};//具体观察者,看 NBA 的class NBAObserver : public CObserverBase{public:NBAObserver(string strname,SecretaryBase* strsub):CObserverBase(strname,strsub){}virtual void Update();};public:string action;vectorpublic:void Attach(CObserverBase* ob){observers.push_back(ob);}void Notify(){vector(*p)-Update();p++;}}};void StockObserver::Update(){coutcoutSecretaryBase *p=new Secretary(); // 创建观察者//被观察的对象CObserverBase *s1= new NBAObserver("小李",p);CObserverBase *s2 = new StockObserver("小赵",p);//加入观察队列p-Attach(s1);p-Attach(s2);//事件p-action="老板来了";//通知p-Notify();return 0;}public:string m_strName;Component(string strName){m_strName = strName;}virtual void Add(Component* com)=0;virtual void Display(int nDepth)=0;};public:Leaf(string strNam e): Component(strName){}//叶子没有增加分支和树叶,所以Add方法实现没有意义。//但是这样可以消除叶节点和枝节点对象在抽象层次的区别,具有完全一致的接口virtual void Add(Component* com){coutstring strtemp;for(int i = 0; i 

上一篇:新服务器mod怎么用?

下一篇:揭秘框架与网页源代码制作流程,从入门到精通!