11.13 实验十一装饰模式 实验十二外观模式
实验11:装饰模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解装饰模式的动机,掌握该模式的结构;
2、能够利用装饰模式解决实际问题。
[实验任务一]:手机功能的升级
用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。
实验要求:
1.提交类图;
2.提交源代码;
3.注意编程规范。

#include <iostream>
using namespace std;
class Phone
{
public:
virtual void receiveCall(){};
};
class SimplePhone:public Phone
{
public:
virtual void receiveCall(){
cout<<"发出声音!"<<endl;
}
};
class PhoneDecorator:public Phone {
protected:
Phone *phone;
public:
PhoneDecorator(Phone *p)
{
phone=p;
}
virtual void receiveCall()
{
phone->receiveCall();
}
};
class JarPhone:public PhoneDecorator{
public:
JarPhone(Phone *p):PhoneDecorator(p){}
void receiveCall()
{
phone->receiveCall();
cout<<"会震动!"<<endl;
}
};
class ComplexPhone:public PhoneDecorator{
public:
ComplexPhone(Phone *p):PhoneDecorator(p){}
void receiveCall()
{
phone->receiveCall();
cout<<"会发光!"<<endl;
}
};
int main()
{
Phone *p1=new SimplePhone();
p1->receiveCall();
cout<<"Jarphone"<<endl;
Phone *p2=new JarPhone(p1);
p2->receiveCall();
cout<<"ComplexPhone"<<endl;
Phone *p3=new ComplexPhone(p2);
p3->receiveCall();
return 0;
}
实验12:外观模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解外观模式的动机,掌握该模式的结构;
2、能够利用外观模式解决实际问题。
[实验任务一]:计算机开启
在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法 ,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算机启动失败。
实验要求:
1.提交类图;
2.提交源代码;
3.注意编程规范。

import java.util.ArrayList;import java.util.List;
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract boolean start();
public String getName() {
return name;
}}
public class Memory extends Component {
public Memory() {
super("内存");
}
@Override
public boolean start() {
System.out.println(name + "开始自检...");
// 模拟自检过程,此处默认成功,可修改为false模拟失败
boolean success = true;
if (success) {
System.out.println(name + "自检成功");
return true;
} else {
System.out.println(name + "自检失败");
return false;
}
}}
public class CPU extends Component {
public CPU() {
super("CPU");
}
@Override
public boolean start() {
System.out.println(name + "开始运行...");
// 模拟CPU启动过程
boolean success = true;
if (success) {
System.out.println(name + "运行正常");
return true;
} else {
System.out.println(name + "启动失败");
return false;
}
}}
public class HardDisk extends Component {
public HardDisk() {
super("硬盘");
}
@Override
public boolean start() {
System.out.println(name + "开始读取...");
// 模拟硬盘启动过程
boolean success = true;
if (success) {
System.out.println(name + "读取成功");
return true;
} else {
System.out.println(name + "读取失败");
return false;
}
}}
public class OS extends Component {
public OS() {
super("操作系统");
}
@Override
public boolean start() {
System.out.println(name + "开始载入...");
// 模拟操作系统启动过程
boolean success = true;
if (success) {
System.out.println(name + "载入成功");
return true;
} else {
System.out.println(name + "载入失败");
return false;
}
}}
public class Mainframe {
private List<Component> components;
public Mainframe() {
components = new ArrayList<>();
// 初始化组件(按启动顺序添加)
components.add(new Memory());
components.add(new CPU());
components.add(new HardDisk());
components.add(new OS());
}
public boolean on() {
System.out.println("按下开机按钮,计算机开始启动...");
for (Component component : components) {
if (!component.start()) {
System.out.println("计算机启动失败:" + component.getName() + "启动异常");
return false;
}
}
System.out.println("所有组件启动完成,计算机启动成功!");
return true;
}}
public class MainframeTest {
public static void main(String[] args) {
Mainframe mainframe = new Mainframe();
mainframe.on();
// 若要测试失败场景,可修改任一Component的start()方法返回false
}}

浙公网安备 33010602011771号