【设计模式学习笔记】解释器模式、迭代器模式案例详解(C++实现)

简介: 【设计模式学习笔记】解释器模式、迭代器模式案例详解(C++实现)

一、解释器模式

1. 什么是解释器模式

interpreter Pattern,解释器模式,是一种行为型模式。解释器模式提供一种对自定义语句的解释机制,解释器模式包含以下几种角色:

  • Context:解释器的上下文环境,包含了不属于解释器的其他信息;
  • AbstractExpression:抽象解释器,定义了一个抽象的解释操作接口;
  • ConcreteExpression:具体解释器,实现对相关操作的解释;

2. 解释器模式案例

定义上下文环境

1. class Context
2. {
3. private:
4.  int data;
5.  int ret;
6. public:
7.  void set_data(int data)
8.  {
9.    this->data = data;
10.   }
11.   void set_ret(int ret)
12.   {
13.     this->ret = ret;
14.   }
15.   int get_data()
16.   {
17.     return this->data;
18.   }
19.   int get_ret()
20.   {
21.     return this->ret;
22.   }
23. };

定义抽象解释器类,并实现一个加法解释器,加法解释器的操作是对传入的数据执行+1操作

1. class Expression
2. {
3. protected:
4.  Context* context;
5. public:
6.  virtual void interpret(Context* context) = 0;
7. };
8. 
9. class PlusExpression : public Expression
10. {
11.   virtual void interpret(Context* context)
12.   {
13.     int temp = context->get_data();
14.     temp++;
15.     context->set_ret(temp);
16.   }
17. };

客户端操作,向加法解释器传入一个数据,打印处理结果

1. int main()
2. {
3.  Expression* e = NULL;
4.  Context* data = NULL;
5. 
6.  e = new PlusExpression;
7.  data = new Context;
8. 
9.  data->set_data(1);
10.   cout << "原始数据:" << data->get_data() << endl;
11.   e->interpret(data);
12.   data->get_ret();
13.   cout << "经加法解释器处理后:" << data->get_ret() << endl;
14. 
15.   delete data;
16.   delete e;
17. 
18.   system("pause");
19.   return 0;
20. }

二、迭代器模式

1. 什么是迭代器模式

Iterator Pattern,迭代器模式,是行为型模式的一种。迭代器模式提供了一种从外部遍历访问一个容器的方法,并且在不需知道容器内部细节的前提下就可以完成对容器的顺序遍历。所以,创建迭代器的容器应该将自身的引用(this指针)传递给迭代器,迭代器通过持有的这个容器的引用来实现对容器的遍历。

  • Iterator:迭代抽象类,用于提供实现迭代的最小方法集,一般包括获取开始对象、获取下一个对象、获取当前对象、判断是否结束这几个方法;
  • ConcreteIterator:具体的迭代器,实现抽象迭代器定义的方法;
  • Aggregate:聚集抽象类,可以理解为一个容器的接口;
  • ConcreteAggregate:具体聚集类,容器的实现类;

2. 迭代器模式案例

定义一个抽象的迭代器类

1. class Iterator
2. {
3. public:
4.  virtual void first() = 0;
5.  virtual void next() = 0;
6.  virtual bool is_done() = 0;
7.  virtual int current_item() = 0;
8. };

定义抽象容器类

1. class Aggregate
2. {
3. public:
4.  virtual Iterator* create_iterator() = 0;
5.  virtual int get_item(int index) = 0;
6.  virtual int get_size() = 0;
7. };

实现一个int类型的迭代器

1. class IntIterator : public Iterator
2. {
3. private:
4.  Aggregate* age;
5.  int index;
6. public:
7.  IntIterator(Aggregate* age) //迭代器应该持有一个创建迭代器的容器的引用,这样才能通过迭代器访问容器
8.  {             //谁创建迭代器就把谁的引用传递给迭代器
9.    this->age = age;
10.     this->index = 0;
11.   }
12.   virtual void first()
13.   {
14.     index = 0;
15.   }
16.   virtual void next()
17.   {
18.     if (index < age->get_size())
19.     {
20.       index++;
21.     }
22.   }
23.   virtual bool is_done()
24.   {
25.     if (index == age->get_size())
26.     {
27.       return true;
28.     }
29.     return false;
30.   }
31.   virtual int current_item()
32.   {
33.     return age->get_item(index);
34.   }
35. };

定义一个int类型的容器

1. class IntArray : Aggregate
2. {
3. private:
4.  int size;
5.  int* array;
6. public:
7.  IntArray(int size)
8.  {
9.    this->size = size;
10.     array = new int[size];
11.     for (int i = 0; i < size; i++)
12.     {
13.       array[i] = i + 1;
14.     }
15.   }
16.   ~IntArray()
17.   {
18.     if (array != NULL)
19.     {
20.       delete array;
21.       array = NULL;
22.     }
23.     this->size = 0;
24.   }
25.   virtual Iterator* create_iterator()
26.   {
27.     return new IntIterator(this); //把自己的引用传给迭代器
28.   }
29.   virtual int get_item(int index)
30.   {
31.     return array[index];
32.   }
33.   virtual int get_size()
34.   {
35.     return this->size;
36.   }
37. };

客户端,通过迭代器来遍历数组

1. int main()
2. {
3.  Iterator* it = NULL;
4.  IntArray* array = NULL;
5. 
6.  array = new IntArray(10);
7.  it = array->create_iterator();
8.  cout << "遍历数组:";
9.  for (; !(it->is_done()); it->next())
10.   {
11.     cout << it->current_item() << " ";
12.   }
13.   cout << endl;
14. 
15.   system("pause");
16.   return 0;
17. }


相关文章
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
2月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
29 2
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
42 0
|
2月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
26 0
|
3月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
3月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
4月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
49 0
|
4月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
44 0
|
27天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###