关联关系
A类会用到B类,这是一种强依赖关系,是长期的并非偶然。
代码:A类的成员变量中含有B类。
A类用到B类,实线箭头从A类指向B类
聚合关系
聚合是关联关系的一种特例,是整体和部分的关系
- 代表了has-a的关系
- 整体和部分之间是可分离的,部分可以属于多个整体
- 整体和部分拥有各自的生命周期。整体存在与否不会相互影响部分,反之亦然
代码体现:
作为整体的A类,有序列类型的属性,用于保存部分。
学校类和学生类、公司类和员工类等,就属于聚合关系。
案例
在电商项目中,购物车和商品的关系,就是聚合关系
我们将要实现购商品类Goods和物车类Cart
UML类图:
使用空心菱形+实线箭头表示,空心菱形边指向类Cart(整体),实现箭头边指向部分类Goods(部分)
Cart类属性说明:
- _goods_dict:dict类型,key是商品编号,value是dict类型的序列,该序列中,key是”goods”,value是goods对象,key是”num”,value是数量
- _total_num:int类型,购物车里商品的总共数量
- _total_price:float类型,总共价格
Cart类方法说明:
- add_goods():添加一个商品。如果是增加购物车中已有的商品,就将商品对应的数量加1;如果是增加购物车中没有的商品,就将商品添加到_goods_dict属性中,且数量是1。同时将_goods_num加1,并将_total_price加上该商品的价格
- remove_goods():移除一个商品。如果是移除购物车中已有的商品,当商品数量为1时,就将该商品从_goods_dict属性中删除,当商品数量大于1时,就将商品对应的数量减1;如果移除购物车中没有的商品时,不做操作。同时将_goods_num减1,并将_total_price减去该商品的价格
- get_total_price():返回_total_price属性
- get_total_num():返回_total_num属性
- get_goods():返回_goods_dict属性
- _has_goods():判断该商品是否存在在购物车中。用商品的编号进行判断,不能通过商品名判断,因为同一个名字的商品,可以由不同的店铺售卖。而商品编号是唯一的。
代码如下:
商品类:
class Goods:
def __init__(self,id,name,price):
#商品编号
self._id=id
self._name=name
self._price=price
def get_id(self):
return self._id
def get_name(self):
return self._name
def get_price(self):
return self._price
购物车类:
#购物车类
class Cart:
def __init__(self):
#key是商品编号,value是dict类型的序列,其中key是goods,value是goods对象,key是num,value是数量
self._goods_dict={}
#购物车中总共的数量
self._total_num=0
self._total_price=0
def add_goods(self,goods):
b=self._has_goods(goods)
id=goods.get_id()
if b:
goods_num_dict=self._goods_dict[id]
num=goods_num_dict['num']
goods_num_dict['num']=num+1
else:
self._goods_dict[id]={"goods":goods,"num":1}
self._total_num+=1
self._total_price+=goods.get_price()
#伪私有方法,判断商品是否存在
def _has_goods(self,goods):
if goods.get_id() in self._goods_dict.keys():
return True
else:
return False
def remove_goods(self,goods):
b=self._has_goods(goods)
id=goods.get_id()
#如果存在
if b:
goods_num_dict=self._goods_dict[id]
num=goods_num_dict['num']
#判断数量是1,就移除
if num==1:
del self._goods_dict[id]
else:
goods_num_dict['num']=num-1
self._total_num-=1
self._total_price-=goods.get_price()
def get_total_price(self):
return self._total_price
def get_total_num(self):
return self._total_num
def get_goods(self):
return self._goods_dict
调用:
def print_info():
print("购物车数量:%d,品类:%d,数量:%d,总价:%d,商品:"%(cart.get_total_num(),len(cart.get_goods()),cart.get_total_num(),cart.get_total_price()),end="")
for key,value in cart.get_goods().items():
print("{%s:{num:%s,goods:<id:%s,name:%s,price:%d>}}"%(key,value['num'],value["goods"].get_id(),value["goods"].get_name(),value["goods"].get_price()),end=",")
print()
cdb=Goods("001","小米充电宝",100)
dnb=Goods("002","小米电脑包",120)
dnb2=Goods("002","小米电脑包",120)
dnb3=Goods("003","小米电脑包",120)
cart=Cart()
cart.add_goods(cdb)
print_info()
cart.add_goods(dnb)
print_info()
cart.add_goods(dnb2)
print_info()
cart.add_goods(dnb3)
print_info()
cart.remove_goods(dnb2)
print_info()
cart.remove_goods(dnb2)
print_info()

