← 目录软考状元讲义

C++程序设计(二选一)

题库 9 · 章节 104 · 共 6 题(案例 6)


1. (案例题)阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 Facade(外观)模式是一种通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。以医院为例,就医时患者需要与医院不同的职能部门交互,完成挂号、门诊、取药等操作。为简化就医流程,设置了一个接待员的职位,代患者完成上述就医步骤,患者则只需与接待员交互即可。如6-1给出了以外观模式实现该场景的类图。 图片 【C++代码】 #include #include using namespace str; import java.util.*; class Patient{ public: (1) ; }; class Disposer{ public: (2) ; } class Registry:public Disposer{//挂号 public: void dispose(Patient *patient){ Cout<<”I am registering......”<getName()<<endl; } } class Doctor:public Disposer{//医生门诊 public: void dispose(Patient *patient){ cout<<”I am diagnosing......”<getName()<<endl; } } class Pharmacy:public Disposer{//取药 public: void dispose(Patient *patient){ Cout<<”I am giving medicine...”<getName()<<endl; } } class Facade{ private: Patient *patient; public: Facade(Patient *patient){this->patient = patient;} void dispose(){ Registry *registry = new Registry(); Doctor doctor = new Doctor(); Pharmacy *ph = new Pharmacy(); registry->disposer(patient); doctor->disposer(patient); ph->disposer(patient); } } class ConcretePatient:public Patient{ private: String name; public: ConcretePatient(String name){this->name = name;} String getName(){return Name;} } int main(){ Patient *patient = (3) ; (4) f = (5) ; (6) ; }

参考答案:

(1)virtual string getName = 0 (2)virtual void dispose(Patient *patient) = 0 (3)new ConcretePatient(“name”) (4)Facade * (5)new Facade(patient) (6)f->dispose()


2. (案例题)阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 在软件系统中,通常都会给用户提供取消、不确定或者错误的操作,允许将系统回复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图5-1所示的类图。 Memento包含了要被恢复的状态。Originator创建并在Memento中存储状态。CareTaker负责从Memento中恢复状态。 图片 【C++代码】 #include #include #include using namespace std; class Memento { private: string state; public: Memento(string state) { this->state = state; } string getState() { return state; } }; class Originator { private: string state; public: void setState(string state) { this->state = state; } string getState() { return state; } Memento saveStateToMemento() { return (1) ; } void getStateFromMemento(Memento Memento) { state = (2) ; } }; class CareTaker { private: vector mementoList; public: void (3) { mementoList.push_back(state); } (4) { return mementoList[index]; } }; int main() { Originator *originator = new Originator(); CareTaker *careTaker = new CareTaker(); originator->setState("State #1"); originator->setState("State #2"); careTaker->add( (5) ); originator->setState("State #3"); careTaker->add( (6) ); originator->setState("State #4"); cout << "Current State:" + originator->getState() << endl; originator->getStateFromMemento(careTaker->get(0)); cout << "First saved State:" + originator->getState() << endl; originator->getStateFromMemento(careTaker->get(1)); cout << "Second saved State:" + originator->getState() << endl; }

参考答案:

(1)new Memento(state) (2)Memento->getState() (3)add(Memento *state) (4)Memento *get(int index) (5)originator->saveStateToMemento() (6)originator->saveStateToMemento()


3. (案例题)阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某文件管理系统中定义了类OfficeDoc和DocExplorer。当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer)设计模式来实现该需求,所设计的类图如图5-1所示。 图片 【C++代码】 #include #include #include using namespace std; class Observer { public : (1) ; }; class Subject { protected : vector< (2) > myObs; public : virtual void Attach(Observer *obs) { myObs.push_back(obs); } virtual void Detach(Observer *obs) { for (vector<Observer*>::iterator iter = myObs.begin(); iter != myObs.end(); iter ++ ) { if (*iter == obs) { myObs.erase(iter); return; } } } virtual void Notify() { for (vector<Observer*>::iterator iter = myObs.begin(); iter != myObs.end(); iter ++ ) { (3) ; } } virtual int getStatus() = 0; virtual void setStatus(int status) = 0; }; class OfficeDoc : public Subject { private : string mySubjectName; int m_status; public : OfficeDoc(string name) : mySubjectName(name), m_status(0) {} void setStatus(int status) { m_status = status; } int getStatus() { return m_status; } }; class DocExplorer : public Observer { private : string myObsName; public : DocExplorer(string name, (4) sub) : myObsName(name) { sub-> (5) ; } void update() { cout << "update observer:" << myObsName << endl; } }; int main() { Subject *subjectA = new OfficeDoc("subject A"); Observer *observerA = new DocExplorer("observerA", subjectA); subjectA->setStatus(1); subjectA->Notify(); return 0; }

参考答案:

(1)virtual void update()=0 (2)Observer* (3)(iter)->update() (4)Subject (5)Attach(this)


4. (案例题)阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某软件公司欲开发一款汽车竞速类游戏,需要模拟长轮胎和短轮胎急刹车时在路面上留下的不同痕迹,并考虑后续能模拟更多种轮胎急刹车时的痕迹。现采用策略(Strategy)设计模式来实现该需求,所设计的类图如图5-1所示。 图片 【C++代码】 #include using namespace std; class BrakeBehavior { public : (1) ; /* 其余代码省略 / }; class LongWheelBrake : public BrakeBehavior { public : void stop() { cout << "模拟长轮胎刹车痕迹!" << endl; } / 其余代码省略 / }; class ShortWheelBrake : public BrakeBehavior { public : void stop() { cout << "模拟短轮胎刹车痕迹!" << endl; / 其余代码省略 / }; class Car { protected : (2) wheel; public : void break() { (3) ; } / 其余代码省略 / }; class ShortWheelCar : public Car { public : ShortWheelCar(BrakeBehavior behavior) { (4) ; } /* 其余代码省略 / }; s int main() { BrakeBehavior break = new ShortWheelBrake(); ShortWheelCar car1(brake); car1. (5) ; return 0; }

参考答案:

(1)virtual void stop()=0 (2)BrakeBehavior* (3)wheel->stop() (4)wheel=behavior (5)brake()


5. (案例题)阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某航空公司的会员积分系统将其会员划分为:普卡(Basic)、银卡(Silver)和金卡(Gold)三个等级。非会员(NonMember)可以申请成为普卡会员。会员的等级根据其一年内累积的里程数进行调整。描述会员等级调整的状态图如图5-1所示。现采用状态(State)模式实现上述场景,得到如图5-2所示的类图。 图片 图片 【C++代码】 #include using namespace std; class CFrequentFlyer; clss CBasic; class CSilver; class CGold; class CNoCustomer; // 提前引用 class CState { private : int flyMiles; // 里程数 public : (1) ; // 根据累积里程数调整会员等级 }; class CFrequentFlyer { friend class CBasic; friend class CSilver; friend class CGold; private : CState *state; CState *nocustomer; CState *basic; CState *silver; Cstate gold; double flyMiles; public : CFrequentFlyer() { flyMiles = 0; setState(nocustomer); } void setState(CState state) { this->state = state; } void travel(int miles) { double bonusMiles = state->travel(miles, this); flyMiles = flyMiles + bonusMiles; } }; class CNoCustomer : public CState { // 非会员 public : double travel(int miles, CFrequentFlyer context) { // 不累积里程数 cout << "Your travel will not account for points\n"; return miles; } }; class CBasic : public CState { // 普卡会员 public : double travel(int miles, CFrequentFlyer* context) { if (context->flyMiles >= 25000 && context->flyMiles < 50000) (2) ; if (context->flyMiles >= 50000) (3) ; return miles + 0.5 * miles; // 累积里程数 } }; class CGold : public CState { // 金卡会员 public : double travel(int miles, CFrequentFlyer context) { if (context->flyMiles >= 25000 && context->flyMiles < 50000) (4) ; if (context->flyMiles < 25000) (5) ; return miles + 0.5 * miles; // 累积里程数 } }; class CSilver : public CState { // 银卡会员 public : double travel(int miles, CFrequentFlyer* context) { if (context->flyMiles < 25000) context->setState(context->basic); if (context->flyMiles >= 50000) context->setState(context->gold); return (miles + 0.25 * miles); } };

参考答案:

(1)virtual double travel(int miles, CFrequentFlyer* context)=0 (2)context->setState(context->silver) (3)context->setState(context->gold) (4)context->setState(context->silver) (5)context->setState(context->basic)


6. (案例题)阅读下列说明和C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 生成器(Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。图5-1所示为其类图。 图片 【C++代码】 #include #include using namespace std; class Product { private : string partA, partB; public : Product() { } void setPartA(const string& s) { partA = s; } void setPartB(const string& s) { partB = s; } // 其余代码省略 }; class Builder { public : (1) ; virtual void buildPartB() = 0; (2) ; }; class ConcreteBuilder1 : public Builder { private : Product* product; public : ConcreteBuilder1() { product = new Product(); } void buildPartA() { (3) ("Component A"); } void buildPartB() { (4) ("Component B"); } Product* getResult() { return product; } // 其余代码省略 }; class ConcreteBuilder2 : public Builder { /* 代码省略 / }; class Director { private: Builder builder; public : Director(Builder* pBuilder) { builder = pBuilder; } void construct() { (5) ; // 其余代码省略 } // 其余代码省略 }; int main() { Director* director1 = new Director(new ConcreteBuilder1()); director1->construct(); delete director1; return 0; }

参考答案:

(1)virtual void buildPartA()=0 (2)virtual Product* getResult()=0 (3)product->setPartA (4)product->setPartB (5)builder->buildPartA() 或builder->buildPartB()