设为首页 加入收藏

TOP

设计模式C++实现――迭代器模式
2015-07-24 06:13:25 来源: 作者: 【 】 浏览:29
Tags:设计模式 实现 模式

模式定义

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。

模式结构:

\

<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICBJdGVyYXRvcqO6tfy0+sb3tqjS5bfDzsq6zbHpwPrUqsvYtcS907/aPC9wPgo8cD4gICAgICAgIENvbmNyZXRlSXRlcmF0b3I6vt/M5bX8tPrG98q1z9a1/LT6xve907/ao7u21LjDvtu6z7HpwPrKsbj619m1scewzrvWwzwvcD4KPHA+ICAgICAgICBBZ2dyZWdhdGU6vtu6z7ao0uW0tL2oz+DTprXEtfy0+sb3ttTP873Tv9o8L3A+CjxwPiAgICAgICAgQ29uY3JldGVBZ2dyZWdhdGU6vt/M5b7bus/Ktc/WtLS9qM/g06a1/LT6xve1xL3Tv9qjrLjDstnX97e1u9hDb25jcmV0ZUl0ZXJhdG9ytcTSu7j2ysq1sbXEyrXA/aGjPC9wPgo8aDE+vtnA/aO6PC9oMT4KPHA+ICAgICAgICC85bH9zt26zc7nss216rrPsqK689Do0qq2qNbG0ru33dDCtcSyzbWlo6y1q9PJ09q85bH9zt21xNStssu1pcrH08PBtLHtyrXP1qOstvjO57LNtePUrbLLtaXKx9PDyv3X6cq1z9Yoy/vDx7XEtqjS5cjnz8LL+cq+KaOsy/nS1LTy06HQwrLNtaW1xMqxuvLQ6NKqt9ax8NGtu7ex6cD61K2yzbWl1tC1xLLLtaXP7qGjPC9wPgo8cCBhbGlnbj0="left">

//菜单项类
class MenuItem
{
public:
	MenuItem(){}
	MenuItem(string na, string descrip, double pric)
	{
		name = na;
		description = descrip;
		price = pric;
	}

	string getName()
	{
		return name;
	}

	string getDescription()
	{
		return description;
	}
	
	double getPrice()
	{
		return price;
	}
private:
	string name;
	string description;
	double price;
};
//煎饼屋餐单类
class PancakeHouseMenu
{
public:
	PancakeHouseMenu()
	{
		addItem("K&B'S Breakfase","pacakes with eggs",2.99);
		addItem("Buleberry Breakfase","pacakes with buleberries",3.99);
	}

	void addItem(string na, string descrip, double ric)
	{
		MenuItem menuItem(na,descrip,ric);
		menuItems.push_back(menuItem);
	}
	list
  
    getMenuItems()
	{
		return menuItems;
	}
private:
	list
   
     menuItems; }; //午餐点餐单类 class DinerMenu { public: DinerMenu() { addItem("Vegetarian BLT", "Bacon with lettuce", 2.99); addItem("BLT", "Bacon with tomato", 3.99); } void addItem(string na, string descrip, double ric) { MenuItem menuItem(na,descrip,ric); menuItems.push_back(menuItem); } vector
    
      getMenuItems() { return menuItems; } private: vector
     
       menuItems; }; //必须调用pancakeHouseMenu.getMenuItems()和//dinerMenu.getMenuItems()来取得他们的餐单 PancakeHouseMenu pancakeHouseMenu; list
      
        breakfastItems = pancakeHouseMenu.getMenuItems(); DinerMenu dinerMenu; vector
       
         lunchItem = dinerMenu.getMenuItems(); list
        
         ::iterator iter = breakfastItems.begin(); //打印新餐单的时候需要分别循环遍历原餐单中的菜单项 for(; iter != breakfastItems.end(); ++iter) { MenuItem menuItem = *iter; cout << menuItem.getName() << " "<< menuItem.getPrice()<<" " << menuItem.getDescription() << endl; } for(unsigned int i=0; i
         
          

如果还有第三家餐厅加入,我们还需要第三个循环,意味着要写很多重复代码。解决方法利用迭代器模式。

UML设计:

\

编程实现及执行结果:

#include 
           
            
#include 
            
              #include 
             
               #include 
              
                using namespace std; //菜单项类 class MenuItem { public: MenuItem(){} MenuItem(string na, string descrip, double pric) { name = na; description = descrip; price = pric; } string getName() { return name; } string getDescription() { return description; } double getPrice() { return price; } private: string name; string description; double price; }; //迭代器基类 class Iterator { public: //是否有下一个一个菜单 virtual bool hasNext(){throw std::exception("ERROR");}; //取下一个菜单 virtual MenuItem next(){throw std::exception("ERROR");}; }; //煎饼屋餐单迭代器 class PancakeHouseMenuIterator : public Iterator { public: PancakeHouseMenuIterator(list
               
                 item) { items = item; iter = items.begin(); } MenuItem next() { MenuItem menuItem = *iter; ++iter; return menuItem; } bool hasNext() { if(iter == items.end()) { return false; } else { return true; } } private: list
                
                  items; list
                 
                  ::const_iterator iter; }; //午餐店餐单迭代器 class DinerMenuIterator : public Iterator { public: DinerMenuIterator(vector
                  
                    item):position(0) { items = item; } MenuItem next() { MenuItem menuItem = items[position]; position = position + 1; return menuItem; } bool hasNext() { if(position >= items.size()) { return false; } else { return true; } } private: vector
                   
                     items; unsigned int position; }; //餐单基类 class Menu { public: //创建迭代器 virtual Iterator* createIterator(){throw std::exception("ERROR");} }; //煎饼屋餐单类 class PancakeHouseMenu : public Menu { public: PancakeHouseMenu() { addItem("K&B'S Breakfase","pacakes with eggs",2.99); addItem("Buleberry Breakfase","pacakes with buleberries",3.99); } //增加菜单 void addItem(string na, string descrip, double ric) { MenuItem menuItem(na,descrip,ric); menuItems.push_back(menuItem); } //创建PancakeHouseMenuIterator迭代器 Iterator* createIterator() { return new PancakeHouseMenuIterator(menuItems); } private: list
                    
                      menuItems; }; //午餐点餐单类 class DinerMenu : public Menu { public: DinerMenu() { addItem("Vegetarian BLT", "Bacon with lettuce", 2.99); addItem("BLT", "Bacon with tomato", 3.99); } void addItem(string na, string descrip, double ric) { MenuItem menuItem(na,descrip,ric); menuItems.push_back(menuItem); } Iterator* createIterator() { return new DinerMenuIterator(menuItems); } private: vector
                     
                       menuItems; }; //服务生类 class Waitress { public: Waitress(Menu* p_PancakeHouseMenu, Menu* p_DinerMenu) { pPancakeHouseMenu = p_PancakeHouseMenu; pDinerMenu = p_DinerMenu; } //打印菜单 void printMenu() { Iterator* pPancakeHouseIterator = pPancakeHouseMenu->createIterator(); Iterator* pDinerIterator = pDinerMenu->createIterator(); cout << "Menu"<< endl <<"----"<
                      
                       hasNext()) { MenuItem menuItem = (MenuItem)iter->next(); cout << menuItem.getName() << " "<< menuItem.getPrice()<<" " << menuItem.getDescription() << endl; } } private: Menu* pPancakeHouseMenu; Menu* pDinerMenu; }; //客户代码 int main() { Menu* pPancakeHouseMenu = new PancakeHouseMenu(); Menu* pDinerMenu = new DinerMenu(); Waitress waitress(pPancakeHouseMenu,pDinerMenu); waitress.printMenu(); return 0; } 
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           

执行结果:

Menu

----

BREAKFAST

K&B'SBreakfase 2.99 pacakes with eggs

BuleberryBreakfase 3.99 pacakes with buleberries

LUNCH

VegetarianBLT 2.99 Bacon with lettuce

BLT 3.99 Bacon with tomato

请按任意键继续. . .

设计原则的应用:

设计原则:一个类应该只有一个引起变化的原因。这个原则告诉我们尽量让一个类保持单一责任。如果一个类具有两个以上改变的原因,那么这会使将来该类的变化率上升。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Design Pattern Template 模板设.. 下一篇对SD卡的读写操作-保存用户登录密..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: