程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 設計模式之裝飾者模式Decorator Pattern

設計模式之裝飾者模式Decorator Pattern

編輯:C++入門知識

近來在讀《Head first設計模式》這本書,感覺很不錯只是書中的代碼是用Java寫的。因為我熟悉的是C++,於是自己寫了C++的例子程序。首先說說我的感受吧,學C++的話,先看《C++ Primer》搞明白了C++的各種語法,對封裝、繼承、多態有初步的認識。然後學點設計模式,設計模式是針對具體事例的解決方案,是前人編程的經驗,很值得借鑒!

        說個具體事例吧,在買電腦的時候我們通常會填一個表單。表單中有電腦、鼠標、鍵盤、耳機、話筒、清潔套裝等等。賣家會根據我們的選擇計算價格。如果要針對這個事例寫個程序該怎麼處理呢?當然我們最直接的想法就是針對每一個選項設置一個布爾型變量,值為真的時候代表你選擇了,值為假的時候代表你沒選。但是這樣有很多缺陷比方說,我以後要添加新的設備供客戶選擇怎麼辦?客戶選擇了兩個鼠標怎麼辦。。。。出現這樣的需求變化時我們只能修改以前寫的代碼。這樣的程序不符合“對擴展開放,對修改關閉”的原則。

       裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

       下面是我用c++寫的代碼:

 

#include <iostream>
#include <string>
using namespace std;

class Component
{
public:
	virtual float cost(){return price;}
	virtual string GetDescription(){return description;}
private:
	float price;
	string description;
};
class Computer : public Component
{
public:
	float cost(){return 5000.0;}
	string GetDescription(){return "Computer";}
};
class Mouse : public Component
{
public:
	Mouse(Component *com){component=com;}
	float cost(){return 50+component->cost();}
	string GetDescription(){return "Mouse "+component->GetDescription();}
private:
	Component *component;
};
class Battery : public Component
{
public:
	Battery(Component *com){component=com;}
	float cost(){return 200.0+component->cost();}
	string GetDescription(){return "Battery "+component->GetDescription();}
private:
	Component *component;
};
void main()
{
	int choose;
	int flg=0;
	Component *com;
	cout<<"Please input your choose:"<<endl;
	cout<<"1: Computer  2: Mouse  3: Batery  4:Quit"<<endl;
	while (1)
	{
		cin>>choose;
		switch (choose)
		{
		case 1:com=new Computer();
			break;
		case 2:com=new Mouse(com); 
			break;
		case 3:com=new Battery(com); 
			break;
		case 4: flg=1; break;
		default: break;
		}
		if (1==flg)
		{
			flg=0;
			break;
		}
	}
	cout<<com->GetDescription()<<endl;
	cout<<com->cost()<<endl;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved