最近在看UML和模式应用一书,感觉获益匪浅,全书围绕两个示例进行分析,其中一个就是著名的POS机示例。
UML分为交互图和类图两个部分,交互图表明类与类之间的相互关联(强调方法),类图表明类本身的属性和成员函数(强调类本身),当然它也给出类之间的对应关系,表明类之间的组合,依赖等关系。
由于交互图篇幅比较大,故在此只上类图:
在实现中为了简单点,把Store 的功能加在了Register上。
类设计如下:
#ifndef __POS_H
#define __POS_H
#include <string>
#include <map>
#include <list>
#include <iostream>
using namespace std;
namespace pos {
enum Unit {
RMB, DOLLAR, PONDS
};
class Money {
public:
Money();
Money(float ct, Unit ut);
~Money();
Money& operator= (const Money& A) {
count_ = A.count_;
unit_ = A.unit_;
};
Money(const Money& A):count_(A.count_), unit_(A.unit_) {
};
Unit GetUnit() const;
float GetCount() const;
private:
float count_;
Unit unit_;
};
class ProductDescription {
public:
// ProductDescription();
ProductDescription(string desc, int id, Money pc);
ProductDescription(const ProductDescription& A):description_(A.description_), item_id_(A.item_id_), price_(A.price_) {
};
~ProductDescription();
string GetDesc() const;
int GetItemid() const;
Money GetItemprice() const;
private:
string description_;
Money price_;
int item_id_;
};
class SalesLineItem {
public:
SalesLineItem(); SalesLineItem(ProductDescription* pdsc, int qty);
float GetSubTotal() const;
private:
int quality_;
ProductDescription* product_desc_;
};
class ProductCatalog {
public:
void AddDesc(int item_id, ProductDescription* pdesc);
ProductDescription* get_pdesc(int item_id) ;
private:
std::map<int, ProductDescription*> item_desc_;
};
class Payment {
public:
Payment(Money money):pay_money_(money) {};
Money get_pay_money() const {
return this->pay_money_;
};
private:
Money pay_money_;
};
class Sale {
public:
float GetTotal();
void MakePayment(Money pay_money);
void MakeLineItem(ProductDescription* pdsc, int qty);
void BecomeComplete();
bool is_complete() const {
return is_complete_;
};
Payment* get_payment() const {
return payment_;
};
private:
typedef std::list<SalesLineItem*>::iterator list_it;
bool is_complete_;
Payment* payment_;
std::list<SalesLineItem*> sale_items_;
};
class Register {
public:
void CreateItemStore();
void AddCatalog();
void MakeNewSale();
void EnterItem(int item_id, int qty);
void MakePayment(Money money);
void EndSale();
float GetRemain() const;
void Clear();
private:
typedef std::list<ProductDescription*>::iterator list_it;
Sale* sale;
ProductCatalog* catalog;
std::list<ProductDescription*> pdesc_storage;
};
}
#endif
具体类的实现就不贴了,感兴趣的可以去我的github上看:https://github.com/wcwu/UMLexample-