博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式总结(二)
阅读量:4568 次
发布时间:2019-06-08

本文共 3719 字,大约阅读时间需要 12 分钟。

原型模式:

  原型模式,DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

  主要用于获取深拷贝的对象。

例子:参考自:

//父类  class Resume  {  protected:      char *name;  public:      Resume() {}      virtual ~Resume() {}      virtual Resume* Clone() { return NULL; }      virtual void Set(char *n) {}      virtual void Show() {}  };  class ResumeA : public Resume  {  public:      ResumeA(const char *str);  //构造函数      ResumeA(const ResumeA &r); //拷贝构造函数      ~ResumeA();                //析构函数      ResumeA* Clone();          //克隆,关键所在      void Show();               //显示内容  };  ResumeA::ResumeA(const char *str)   {      if(str == NULL) {          name = new char[1];           name[0] = '\0';       }      else {          name = new char[strlen(str)+1];          strcpy(name, str);      }  }  ResumeA::~ResumeA() { delete [] name;}  ResumeA::ResumeA(const ResumeA &r) {      name = new char[strlen(r.name)+1];      strcpy(name, r.name);  }  ResumeA* ResumeA::Clone() {      return new ResumeA(*this);  }  void ResumeA::Show() {      cout<<"ResumeA name : "<
<
Clone(); Resume *r4 = r2->Clone(); r1->Show(); r2->Show(); //删除r1,r2 delete r1; delete r2; r1 = r2 = NULL; //深拷贝所以对r3,r4无影响 r3->Show(); r4->Show(); delete r3; delete r4; r3 = r4 = NULL; }

 

模板方法模型:

  模板方法模式:定义一个操作中的的骨架,而将一些步骤延迟到子类中。

  模板方法是一个具体方法,它给出了一个顶层逻辑框架,而逻辑的组成步骤在抽象类中可以是具体方法,也可以是抽象方法。由于模板方法是具体方法,因此模板方法模式中的抽象层只能是抽象类,而不是接口。

 基本方法是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

       (1) 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。在C#语言里一个抽象方法以abstract关键字标识。

       (2) 具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。

       (3) 钩子方法:一个钩子方法由一个抽象类或具体类声明并实现,而其子类可能会加以扩展。通常在父类中给出的实现是一个空实现(可使用virtual关键字将其定义为虚函数),并以该空实现作为方法的默认实现,当然钩子方法也可以提供一个非空的默认实现。

       在模板方法模式中,钩子方法有两类:第一类钩子方法可以与一些具体步骤“挂钩”,以实现在不同条件下执行模板方法中的不同步骤,这类钩子方法的返回类型通常是bool类型的,这类方法名一般为IsXXX(),用于对某个条件进行判断,如果条件满足则执行某一步骤,否则将不执行,如下代码片段所示:

例:转自:

  1. //模板方法  
  2. public void TemplateMethod()   
  3. {  
  4. Open();  
  5. Display();  
  6. //通过钩子方法来确定某步骤是否执行  
  7. if (IsPrint())   
  8. {  
  9.     Print();  
  10. }  
  11. }  
  12. //钩子方法  
  13. public bool IsPrint()  
  14. {  
  15. return true;  
  16. }  

建造者模式  

  建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP)。

例:

  1. class Builder    
  2. {  
  3. public:  
  4.     virtual void BuildHead() {}  
  5.     virtual void BuildBody() {}  
  6.     virtual void BuildLeftArm(){}  
  7.     virtual void BuildRightArm() {}  
  8.     virtual void BuildLeftLeg() {}  
  9.     virtual void BuildRightLeg() {}  
  10. };  
  11. //构造瘦人  
  12. class ThinBuilder : public Builder  
  13. {  
  14. public:  
  15.     void BuildHead() { cout<<"build thin body"<<endl; }  
  16.     void BuildBody() { cout<<"build thin head"<<endl; }  
  17.     void BuildLeftArm() { cout<<"build thin leftarm"<<endl; }  
  18.     void BuildRightArm() { cout<<"build thin rightarm"<<endl; }  
  19.     void BuildLeftLeg() { cout<<"build thin leftleg"<<endl; }  
  20.     void BuildRightLeg() { cout<<"build thin rightleg"<<endl; }  
  21. };  
  22. //构造胖人  
  23. class FatBuilder : public Builder  
  24. {  
  25. public:  
  26.     void BuildHead() { cout<<"build fat body"<<endl; }  
  27.     void BuildBody() { cout<<"build fat head"<<endl; }  
  28.     void BuildLeftArm() { cout<<"build fat leftarm"<<endl; }  
  29.     void BuildRightArm() { cout<<"build fat rightarm"<<endl; }  
  30.     void BuildLeftLeg() { cout<<"build fat leftleg"<<endl; }  
  31.     void BuildRightLeg() { cout<<"build fat rightleg"<<endl; }  
  32. };  
  33. //构造的指挥官  
  34. class Director    
  35. {  
  36. private:  
  37.     Builder *m_pBuilder;  
  38. public:  
  39.     Director(Builder *builder) { m_pBuilder = builder; }  
  40.     void Create(){  
  41.         m_pBuilder->BuildHead();  
  42.         m_pBuilder->BuildBody();  
  43.         m_pBuilder->BuildLeftArm();  
  44.         m_pBuilder->BuildRightArm();  
  45.         m_pBuilder->BuildLeftLeg();  
  46.         m_pBuilder->BuildRightLeg();  
  47.     }  
  48. };  

         客户的使用方式:

 
  1. int main()  
  2. {  
  3.     FatBuilder thin;  
  4.     Director director(&thin);  
  5.     director.Create();  
  6.     return 0;  
  7. }  

建造者模式和模板方法模式,都是给出了大概的算法框架,模板方法把不变行为搬移到父类(超类),去除了类中的重复代码来体现它的优势,而建造者模式则是由建造者类来保存建造过程。

如果算法逻辑复杂,且需要多个建造方法,建造者模式将一个复杂对象的构建与它的表示分离,则十分方便,而如果固定方法较少,模板方法也未尝不可。

转载于:https://www.cnblogs.com/dk666/p/7365041.html

你可能感兴趣的文章
「zigbee - 1」工欲善其事必先利其器 - IAR for 8051 IDE customization
查看>>
jquery prop和attr的区别
查看>>
调用系统文件管理器选择图片,调用系统裁剪AIP对图片处理,显示裁剪之后的图片...
查看>>
Mac & Linux下php7添加memcached和redis扩展
查看>>
Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
查看>>
MS SQL 统计信息浅析上篇
查看>>
YourSQLDba版本升级总结
查看>>
Failure sending mail: The user or group name 'xxx\xxxx' is not recognized.Mail will not be resent
查看>>
分析函数改写自关联
查看>>
appium 数据参数化 登录模块
查看>>
php内置函数分析之array_fill_keys()
查看>>
git 从远程仓库获取所有分支
查看>>
从 Godaddy 转移域名到 Namesilo
查看>>
numpy
查看>>
django | 连接mysql数据库
查看>>
导入sql时报日期类型错误
查看>>
更改arch的默认终端
查看>>
labelme2coco问题:TypeError: Object of type 'int64' is not JSON serializable
查看>>
JDBC连接MySQL数据库的方法和实例
查看>>
初学python之感悟
查看>>