用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。

类图:

Java代码:

public class Changer implements Phone{

    private Phone phone;
public Changer(Phone p) {
this.phone=p;
}
public void voice() {
phone.voice();
}
} public class ComplexPhone extends Changer{ public ComplexPhone(Phone p) {
super(p);
System.out.println("ComplexPhone");
} public void zhendong() {
System.out.println("会震动!");
}
public void dengguang() {
System.out.println("会发光!");
} } public class JarPhone extends Changer{ public JarPhone(Phone p) {
super(p);
System.out.println("Jarphone");
} public void zhendong() {
System.out.println("会震动!");
}
} public interface Phone {
public void voice();
} public class SimplePhone implements Phone{ public void voice() {
System.out.println("发出声音!");
} } public class Client {
public static void main(String[] args) {
Phone phone;
phone=new SimplePhone();
phone.voice();
JarPhone jarphone=new JarPhone(phone);
jarphone.voice();
jarphone.zhendong();
ComplexPhone complexphone = new ComplexPhone(phone);
complexphone.zhendong();
complexphone.dengguang();
}
}

C++代码:

#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;
}

运行结果:

最新文章

  1. Git安装与配置
  2. ubuntu系统中的VMware 安装win7 Ghost镜像的几个坑
  3. C++中 :: 的意思
  4. Socket 之 同步以及异步通信
  5. 读取Excel异常定义了过多字段的解决方法
  6. c++ RTTI(runtime type info)
  7. 一个必用的javascript框架:underscore.js - wine的思考 - ITeye技术网站
  8. 低压电力采集平台DW710C与PC沟通
  9. C# 语言规范_版本5.0 (第7章 表达式)
  10. 支付宝WAP支付接口开发
  11. python-冒泡排序与插入排序
  12. Bandit Wargame Level12 Writeup
  13. GetPathFromUri4kitkat【Android 4.4 kitkat以上及以下根据uri获取路径的方法】
  14. angular.identity()
  15. 《Java大学教程》—第11章 案例研究--第1部分
  16. 微信小程序本地引用iconfont(阿里巴巴矢量图标库)
  17. Tarjan&amp;&amp;缩点简析
  18. [翻译]:Artificial Intelligence for games 5.3 STATE MACHINES:状态机
  19. 502 解决:[WARNING] fpm_children_bury
  20. HeidiSQL数据库mysql/sql-server连接工具

热门文章

  1. (第二章第四部分)TensorFlow框架之TFRecords数据的存储与读取
  2. COS 音视频实践 | 数据工作流助你播放多清晰度视频
  3. 快速整明白Redis中的整数集合到底是个啥
  4. Go 1.18 最强代码自测方法!
  5. 从原理学习Java反序列化
  6. ArcMap操作随记(11)
  7. Numpy库基础___三
  8. 使用Resource文件实现应用程序多语言
  9. 74CMS 3.0任意文件写入漏洞
  10. unicode decode error解决办法