11种设计模式精简总结

1 工厂模式: 简单工厂:一个工厂类,一个静态方法,根据传的类名,创建一个指向抽象类对象的引用或指针 工厂方法:没有工厂类!一个抽象的类A中创建一个抽象的对象

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