软件设计实验21,22,23:观察者模式,状态模式,策略模式
实验 21:观察者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解观察者模式的动机,掌握该模式的结构;
2、能够利用观察者模式解决实际问题。
[实验任务一]:股票提醒
当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价格下降时会大哭一场。
实验要求:
1.画出对应类图;
2.提交源代码;
3.注意编程规范。

include
include
using namespace std;
// 观察者接口
class IObserver {
public:
virtual void respond(int rate) = 0;
};
// 主题接口
class ISubject {
protected:
list<IObserver> observers; // 存储观察者列表
public:
// 注册方法
void attach(IObserver observer) {
observers.push_back(observer);
}
// 注销方法
void detach(IObserver* observer) {
observers.remove(observer);
}
// 抽象通知方法
virtual void notify(int rate) = 0;
};
// 具体主题类
class Stock : public ISubject {
public:
void notify(int rate) override {
for (auto observer : observers) {
observer->respond(rate);
}
}
};
// 具体观察者类
class Holder : public IObserver {
public:
void respond(int rate) override {
if (rate >= 5) {
cout << "股票上涨,购买股票" << endl;
}
else if (rate <= -5) {
cout << "股票下跌,大哭一场" << endl;
}
else {
cout << "股票还比较稳定哦~" << endl;
}
}
};
int main() {
ISubject* subject = new Stock();
IObserver* observer = new Holder();
subject->attach(observer);
cout << "----------------------股票上涨-----------------------" << endl;
subject->notify(5);
cout << endl;
cout << "----------------------股票下跌-----------------------" << endl;
subject->notify(-5);
cout << endl;
cout << "----------------------股票稳定-----------------------" << endl;
subject->notify(4);
cout << endl;
delete observer;
delete subject;
return 0;
}
实验 22:状态模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解状态模式的动机,掌握该模式的结构;
2、能够利用状态模式解决实际问题。
[实验任务一]:银行账户
用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化。
实验要求:
1.画出对应的类图;
2.提交源代码;
3. 注意编程规范。

include
include
using namespace std;
class Account;
//环境类
class AccountState{
public:
Account *acc;
double balance;
string stateName;
public:
virtual void stateCheck(double balance)=0;
double getBalance(){
return balance;
}
void setBalance(double balance){
this->balance=balance;
}
string getStateName(){
return stateName;
}
void setStateName(string statename){
this->stateName=statename;
}
void deposit(double amount);
virtual void withdraw(double amount);
};
//抽象状态类
class Account{
private:
AccountState *state;
string name;
public:
Account(string name);
void setState(AccountState state) {
this->state=state;
}
AccountState getState() {
return this->state;
}
string getName() {
return this->name;
}
void deposit(double amount) {
state->deposit(amount);
}
void withdraw(double amount) {
state->withdraw(amount);
}
};
//具体状态类
class RedState :public AccountState{
public:
RedState(AccountState *state) {
this->balance = state->balance;
this->acc = state->acc;
this->stateName="透支状态";
}
void withdraw(double amount){
cout<<"对不起,"<
cout<<"当前余额:"<<balance<<"元,当前状态:"<
}
void stateCheck(double balance);
};
class YellowState :public AccountState{
public:
YellowState(AccountState *state) {
this->balance = state->balance;
this->acc = state->acc;
this->stateName="欠费状态";
}
void stateCheck(double balance);
};
//具体状态类
class GreenState:public AccountState{
public:
GreenState(Account *acc) {
this->balance = balance;
this->acc = acc;
this->stateName="正常状态";
}
GreenState(AccountState *state) {
this->acc=state->acc;
this->balance=state->balance;
this->stateName="正常状态";
}
void stateCheck(double balance) {
if(balance>=-1000&&balance<0) {
acc->setState(new YellowState(this));
}else if(balance<-1000) {
acc->setState(new RedState(this));
}
else{
acc->setState(new GreenState(this));
}
}
};
//具体状态类
void RedState::stateCheck(double balance){
if(balance>=-1000&&balance<0) {
acc->setState(new YellowState(this));
}else if(balance<-1000) {
acc->setState(new RedState(this));
}
else {
acc->setState(new GreenState(this));
}
}
void YellowState::stateCheck(double balance) {
if(balance>=-1000&&balance<0) {
acc->setState(new YellowState(this));
}else if(balance<-1000) {
acc->setState(new RedState(this));
}
else{
acc->setState(new GreenState(this));
}
}
Account::Account(string owner){
this->name=owner;
this->state=new GreenState(this);
cout<<"恭喜"<<owner<<"开户成功!初始金额:0元"<<endl;
cout<<"**************************************"<<endl;
}
void AccountState::deposit(double amount){
cout<
balance+=amount;
stateCheck(balance);
cout<<"当前余额:"<<balance<<"元,当前状态:"<
}
void AccountState::withdraw(double amount){
cout<
balance-=amount;
stateCheck(balance);
cout<<"当前余额:"<<balance<<"元,当前状态:"<
}
int main(){
Account *account=new Account("安安");
account->deposit(2000);
cout<<"-------------------------------------"<<endl;
account->withdraw(500);
cout<<"-------------------------------------"<<endl;
account->withdraw(2000);
cout<<"-------------------------------------"<<endl;
account->withdraw(600);
cout<<"-------------------------------------"<<endl;
account->withdraw(200);
return 0;
}
实验 23:策略模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解策略模式的动机,掌握该模式的结构;
2、能够利用策略模式解决实际问题。
[实验任务一]:旅行方式的选择
旅游的出行方式有乘坐飞机旅行、乘火车旅行和自行车游,不同的旅游方式有不同的实现过程,客户可以根据自己的需要选择一种合适的旅行方式。
实验要求:
1.画出对应的类图;
2.提交源代码;
3.注意编程规范。

package strategy;
public class Person {
private TourStrategy ts;
public void setTs(TourStrategy ts) {
this.ts = ts;
}
public void travel(){
ts.travel();
}
}
package strategy;
public interface TourStrategy {
public void travel();
}
package strategy;
public class AirStrategy implements TourStrategy{
@Override
public void travel() {
System.out.println("乘坐飞机旅游");
}
}
package strategy;
public class TrainStrategy implements TourStrategy{
@Override
public void travel() {
System.out.println("乘坐火车旅游");
}
}
package strategy;
public class BikeStrategy implements TourStrategy{
@Override
public void travel() {
System.out.println("骑自行车旅游");
}
}
package strategy;
public class Client {
public static void main(String[] args) {
Person p = new Person();
TourStrategy air = new AirStrategy();
p.setTs(air);
p.travel();
System.out.println("-------------------------");
TourStrategy train = new TrainStrategy();
p.setTs(train);
p.travel();
System.out.println("-------------------------");
TourStrategy bike = new BikeStrategy();
p.setTs(bike);
p.travel();
}
}
浙公网安备 33010602011771号