• 11种设计模式精简总结


    1.工厂模式:

    简单工厂:一个工厂类,一个静态方法,根据传的类名,创建一个指向抽象类对象的引用或指针

    工厂方法:没有工厂类!一个抽象的类A中创建一个抽象的对象B,A中有个抽象方法,A的子类去创建具体的B的子类对象

    抽象工厂:一个抽象工厂AF,AF中有创建一系列创建抽象对象的接口,最后,这一系列抽象对象和这个抽象工厂被包装在一个抽象类W中,W的具体类可以指明具体的工厂A,然后A为W创建具体的一些列类(ps:这一些列具体的类是W的成员变量)


    2.迭代器和组合模式

    迭代器模式:两个重要的函数hasNext和next,一个抽象的迭代器Iterator,具体的迭代器实现两个方法,具体的迭代器中包含原始集合,比如list,vector等等

    组合模式:将对象和对象集合看做同样一个东西,实现一个组件接口Component,对象打印的时候直接答应,而对象集合打印的时候用迭代器打印,这里面就会有递归了!可以用迭代器模式迭代组件,碰到对象,那么hasNext返回false,然后可以实现组合迭代器,同样有hasNext和next方法,用栈来实现这两个方法

    Object next()

    {

         if(hasNext())

         {

              Iterator iterator = stack.top();

              Component component = iterator.next();

              if (component 是 对象集合)

              {

                   stack.push(component.creatorIterator());

              }

              return component;

         }

        else

         {

              return NULL;

         }

    }


    bool hasNext()

    {

         if (stack.empty())

         {

              return false;

         }

         else

         {

              Iterator iterator = stack.top();

              if (!iterator.hasNext())

              {

                   stack.pop();

                   return hasNext();

              }

              else

              {

                   return true;

              }

         }

    }




    3.代理模式

    远程代理:本地客户调用本地辅助对象(stub)的方法,然后本地辅助对象通过网络将参数传到远程服务器,远程服务器上有一个服务器辅助对象(skeleton),由这个对象调用远程对象的一些方法,调用完成后将结果通过网络传给stub,继而客户会觉得就像是在调用本地服务一样

    虚拟代理:创建一个大的对象的时候延迟创建,比如载入一副图片的时候,未载入完成的时候可以先显示默认的图片,然后用一个线程不断去请求图片资源,载入完毕后就可以创建真实的对象了

    安全代理:将脆弱的对象放入一个安全代理,由该安全代理进行权限的控制


    4.策略模式

    封装一系列可相互替换的算法家族(显然这些算法家族都实现相同的接口啦),可以在运行的时候动态地给对象赋予新的变量计算过程,比如给怪物的打斗效果,可以根据怪物血量的多少动态地修改打斗的效果


    5.装饰者模式

    装饰者和被装饰者都继承同一个接口A,因此他们都有从接口继承下来的同样的成员函数,装饰者内部可以有另外一个A,因此,装饰者可以给被装饰者动态加上行为,比如接口A中有cost函数,被装饰着直接返回一个浮点数,而装饰者返回内部被装饰者的cost()加上装饰者本身的cost,而内部的被装饰着也可是被装饰过好多次的A对象


    6.观察者模式

    首先得有一个观察者接口和被观察者接口,然后两者是一对多的关系,所以一般被观察者内部会有一个集合来存放所有注册的观察者,基本的方法有注册观察者,移除观察者,以及通知观察者状态已经改变,一般观察者内部会有一个update方法,被通知之后可以调用此方法,而可以根据update的参数选择pull或push的方式


    7.适配器和外观模式

    适配器模式:将一个旧的接口改造成一个新的接口给客户使用,一般而言继承和组合都可以实现,继承的话是继承旧的接口,以及新的接口,这样创建出来的适配器就可以调用旧的接口,并且实际上他又是一个新的接口了,而组合方式更是方便,直接将旧的接口扔到新的接口里面,新的接口直接调用旧的接口对象的方法

    外观模式:一个对象,内部含有很多小对象,而要实现一个功能需要调用很多小的对象的方法,因此可以将这个小的对象的方法封装成一个方法,这样,客户直接调用它即可,相当于一个整洁的外观,这些小的组件可以轻松的替换


    8.模板方法模式

    由父类创建算法大纲,这个算法大纲一般不能被子类覆盖,算法大纲中会调用抽象方法和具体方法,抽象方法一般是所有的算法共同需要的,而抽象方法可以由子类自由覆盖,以形成自己的特色,而大纲中也能会有一些钩子函数,子类可以自行决定是否覆盖这些方法,一般而言钩子的作用是为了由子类选择是否调用某些方法,父类大纲中根据钩子函数返回的值决定是否调用某些函数


    9.单例模式

    类中有一个静态方法和一个静态实例,要注意线程安全,避免创建两个实例

    static Object instance;

    if (instance != NULL)

    {

         wait(&mutex);

         {

              if (instance != NULL)

                   instance = new Object();

         }

         singal(&mutex);

         return instance;

    }



    10.命令模式

    一个command接口,两个方法,一个是exectue和undo,而execute委托内部的动作的实行者进行操作,最后这些命令对象可以被自行传递,安装在某些对象里面,比如headfirst中的开关的卡槽,按下按钮只需要调用command对象的execute函数即可,并且定义undo操作之后,开关的卡槽可以记住上一次运行的命令preCommand,然后调用他的undo方法就可以实现撤销

    运用场合:多线程阻塞队列里面取一个运行,只要取出来,然后调用exectue函数即可


    11.状态模式

    首先一个状态接口,然后定义若干个状态,一个宿主中包含这些若干状态和一个当前状态curState,当一个状态改变函数调用的时候,直接调用当前状态对应的状态改变函数,而这些状态中一般会有宿主对象的引用,这样就可以直接通过宿主对象的引用setState来改变curState

  • 相关阅读:
    F. 数学上来先打表
    LibreOJ β Round #2
    noip飞扬的小鸟
    jxoi2017
    分块算法
    Chino的数列
    cf 613E
    cf 126D
    cf 542E
    cf 512D
  • 原文地址:https://www.cnblogs.com/riskyer/p/3329135.html
Copyright © 2020-2023  润新知