C++设计模式
上QQ阅读APP看书,第一时间看更新

2.1.3 季节变换后的服装销售

开闭原则在软件设计中的应用是首要的,程序员将“多扩展、少修改”思想应用在代码设计初期,会给整个开发项目节省很多人力,提高开发效率。本小节将要讲解的“季节变换后的服装销售”是开闭原则的应用的良好体现。

(1)主题——服装店打折

小码路毕业后经营了一家“开闭服装店”,如图2-2所示。

“开闭服装店”的经营模式是这样的:夏天销售T恤;秋装上市的同时,对T恤进行打折出售。请使用开闭原则设计本店经营模式的软件架构。

▲图2-2 开闭服装店

(2)设计——季节变化的烦恼

在服装店成立之初,小码路设计了一套“服装销售”的软件架构,这套架构涵盖创业初期销售T恤的整个流程,并没有考虑后续天气变化导致T恤打折的情况,或者新增服装带来的影响。但是,很多产品的供应会随着季节、天气的变化而变化,对小码路经营的服装店造成了一定的冲击。如何摆脱天气变化带来的烦恼,以及应对不同季节对服装销售的影响呢?

这些问题可以使用开闭原则进行解决。

小码路刚刚学习了开闭原则的设计思路,于是就按照这个思路写了如下设计步骤。

第一步:开闭原则的核心思想是“多扩展、少修改”,这就要考虑软件设计初期的不变性,变化的是初期设计的扩展性。

第二步:设计销售服装的基类,T恤类和秋季服装类是其直接的派生类,T恤是创业初期主要销售的服装,这个派生类可以被看作最初的软件设计架构。

第三步:秋季天气变凉,在派生类T恤类的基础上,继续增加派生类打折T恤类,这样在保证T恤类不变的情况下,扩展了T恤的打折销售功能;同时,在派生类秋季服装类的基础上继续派生出秋季卫衣类,完成卫衣销售功能的扩展。

第四步:引入软件设计的入口,设计一个“服装批发地类”,这个类进行客户端的调用,实现整个软件流程。

随后,小码路利用第1章学习的理论知识画出了整个软件设计流程的UML类图,如图2-3所示。

图2-3中明确了解决服装销售问题的具体程序设计清单,这个程序设计清单主要包括如下内容。

① 创业初期的软件基本框架。虚基类Clothes、直接派生类SkirtClothes和虚基类Clothes、直接派生类AutumnClothes分别构成两个EIT造型。其中派生类SkirtClothes具体实现基类Clothes的虚接口函数getClothesName()和getClothesPrice();派生类AutumnClothes在继承基类虚接口的同时,自身声明另外一个虚接口getAutumnClothesKinds(),用来获取秋季销售的服装种类。

▲图2-3 整个软件设计流程的UML类图

② 对创业初期框架的扩展。保持①中基本框架不变,增加打折T恤类OffPriceSkirtClothes和秋季卫衣类SweaterAutumnClothes。其中OffPriceSkirtClothes类继承自SkirtClothes类,并且与其构成一个新的EIT造型,SkirtClothes作为上一级EIT造型的T、作为下一级EIT造型的E。SweaterAutumnClothes与OffPriceSkirtClothes类似,不同的是,SweaterAutumnClothes类完全实现基类AutumnClothes和上一级基类Clothes的虚方法。

③ 软件设计流程的入口。ClothesStoreFromWenZhou类是客户端的入口,其成员变量list<SkirtClothes>、list<OffPriceSkirtClothes>、list<SweaterAutumnClothes>是客户端实现服装销售的整个软件流程的核心,也是调用自身类方法的开始。