每日总结
软件设计 石家庄铁道大学信息学院
实验11:装饰模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解装饰模式的动机,掌握该模式的结构;
2、能够利用装饰模式解决实际问题。
[实验任务一]:手机功能的升级
用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。
实验要求:
1. 提交类图;
2. 提交源代码;
Java:
Client.java:
package com.rjsjHomework03.decorator;
public class Client {
public static void main(String[] args) {
Phone sp,jp,cp;
sp = new SimplePhone();
sp.ring();
System.out.println();
System.out.println("------------------");
jp = new JarPhone(sp);
jp.ring();
System.out.println();
System.out.println("------------------");
cp = new ComplexPhone(jp);
cp.ring();
}
}
ComplexPhone.java:
package com.rjsjHomework03.decorator;
public class ComplexPhone extends PhoneDecorator{
public ComplexPhone(Phone phone) {
super(phone);
}
public void ring(){
super.ring();
light();
}
public void light(){
System.out.println("发出灯光闪烁提醒主人");
}
}
JarPhone.java:
package com.rjsjHomework03.decorator;
public class JarPhone extends PhoneDecorator{
public JarPhone(Phone phone) {
super(phone);
}
public void ring(){
super.ring();
shock();
}
public void shock(){
System.out.println("震动提醒主人");
}
}
Phone.java:
package com.rjsjHomework03.decorator;
public interface Phone {
void ring();
}
PhoneDecorator.java:
package com.rjsjHomework03.decorator;
public class PhoneDecorator implements Phone{
private Phone phone;
public PhoneDecorator(Phone phone) {
this.phone = phone;
}
@Override
public void ring() {
phone.ring();
}
}
SimplePhone.java:
package com.rjsjHomework03.decorator;
public class SimplePhone implements Phone{
@Override
public void ring() {
System.out.println("发出声音提醒主人");
}
}
C++:
#include<iostream>
using namespace std;
class Phone{
public:
virtual void call()=0;
};
class SimplePhone:public Phone{
public:
void call() override{
cout<<"接听电话,发出声响"<<endl;
}
};
class AdvancePhone:public Phone{
private:
Phone *phone;
public:
explicit AdvancePhone(Phone *phone1){
this->phone=phone1;
}
void call() override{
this->phone->call();
}
};
class JarPhone:public AdvancePhone{
public:
explicit JarPhone(Phone *phone1) : AdvancePhone(phone1) {
}
void call() override{
AdvancePhone::call();
this->shake();
}
void shake(){
cout<<"---发出震动"<<endl;
}
};
class ComplexPhone:public AdvancePhone{
public:
explicit ComplexPhone(Phone *phone1): AdvancePhone(phone1){
}
void call() override{
AdvancePhone::call();
this->light();
}
void light(){
cout<<"---发出灯光闪烁"<<endl;
}
};
int main(){
Phone *simple,*jar,*complex;
simple=new SimplePhone();
jar=new JarPhone(simple);
complex=new ComplexPhone(jar);
simple->call();
jar->call();
complex->call();
return 0;
}
运行截图:
C++:
Java:
3.注意编程规范。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)