设计模式——装饰模式

一、任务

手机功能的升级

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

二、类图

三、代码

1、Java

 1 package tutorial11;
 2 
 3 public class Client {
 4 
 5     public static void main(String[] args) {
 6         // TODO 自动生成的方法存根
 7 
 8           Phone p1 = new SimplePhone();
 9           System.out.println("生产简单手机");
10           p1.serviceCall();
11           
12           System.out.println("***********************");
13           Phone p2 = new JarPhone(p1);
14           System.out.println("升级手机为JarPhone");
15           p2.serviceCall();
16           System.out.println("***********************");
17           Phone p3 = new ComplexPhone(p2);
18           System.out.println("升级手机为ComplexPhone");
19           p3.serviceCall();
20     }
21 
22 }
Client
1 package tutorial11;
2 
3 public abstract class Phone {
4 
5     public void serviceCall() {
6         
7     }
8 }
Phone
1 package tutorial11;
2 
3 public class SimplePhone extends Phone {
4 
5     public void serviceCall() {
6         System.out.println("SimplePhone:发出声音提醒主人电话来了");
7     }
8 }
SimplePhone
 1 package tutorial11;
 2 
 3 public class PhoneDecoration extends Phone {
 4 
 5     private Phone phone=null;
 6     public PhoneDecoration(Phone phone) {
 7           if(phone!=null){
 8                  this.phone = phone;
 9              }else{
10                  this.phone = new SimplePhone();
11              }
12     }
13     @Override
14     public void serviceCall() {
15         phone.serviceCall();
16     }
17 }
PhoneDecoration
 1 package tutorial11;
 2 
 3 public class JarPhone extends PhoneDecoration {
 4 
 5     public JarPhone(Phone phone) {
 6         super(phone);
 7         // TODO 自动生成的构造函数存根
 8     }
 9     @Override
10     public void serviceCall() {
11         super.serviceCall();
12         System.out.println("JarPhone:发出声音并震动提醒主人电话来了");
13     }
14     
15 
16 }
JarPhone
 1 package tutorial11;
 2 
 3 public class ComplexPhone extends PhoneDecoration {
 4 
 5     public ComplexPhone(Phone phone) {
 6         super(phone);
 7         // TODO 自动生成的构造函数存根
 8     }
 9     @Override
10     public void serviceCall() {
11         super.serviceCall();
12         System.out.println("ComplexPhone:发出声音、震动并灯光闪烁提醒主人电话来了");
13     }
14     
15 
16 }
ComplexPhone

2、C++

 1 #include <iostream>
 2 #include <string>
 3 #include <list>
 4 using namespace std;
 5 
 6 class Phone
 7 {
 8 public:
 9     Phone() {}
10     virtual ~Phone() {}
11     virtual void ShowDecorate() {}
12 };
13 //具体的手机类
14 class SimplePhone : public Phone
15 {
16 private:
17     string namePhone;
18 public:
19     SimplePhone(string name) : namePhone(name) {}
20     ~SimplePhone() {}
21     void ShowDecorate() { 
22         cout  <<endl<<namePhone << ":" << endl; 
23     }
24 };
25 //装饰类
26 class DecoratorPhone : public Phone
27 {
28 private:
29     Phone* m_phone;  //要装饰的手机
30 public:
31     DecoratorPhone(Phone* phone) : m_phone(phone) {}
32     virtual void ShowDecorate() { m_phone->ShowDecorate(); }
33 };
34 //具体的装饰类
35 class DecoratorPhoneA : public DecoratorPhone
36 {
37 public:
38     DecoratorPhoneA(Phone* phone) : DecoratorPhone(phone) {}
39     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
40 private:
41     void AddDecorate() { cout << "发出声音提示主人电话来了" << endl; } //增加的装饰
42 };
43 //具体的装饰类
44 class DecoratorPhoneB : public DecoratorPhone
45 {
46 public:
47     DecoratorPhoneB(Phone* phone) : DecoratorPhone(phone) {}
48     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
49 private:
50     void AddDecorate() { cout << "震动提示主人电话来了" << endl; } //增加的装饰
51 };
52 //具体的装饰类
53 class DecoratorPhoneC : public DecoratorPhone
54 {
55 public:
56     DecoratorPhoneC(Phone* phone) : DecoratorPhone(phone) {}
57     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
58 private:
59     void AddDecorate() { cout << "闪烁灯光提示主人电话来了" << endl; } //增加的装饰
60 };
61 int main()
62 {
63     Phone* iphone = new SimplePhone("SimplePhone");
64     Phone* dpa = new DecoratorPhoneA(iphone);
65     dpa->ShowDecorate();
66 
67     Phone* phone = new SimplePhone("JarPhone");
68     Phone* dpA = new DecoratorPhoneA(phone);
69     Phone* dpb = new DecoratorPhoneB(dpA);
70     dpb->ShowDecorate();
71 
72     Phone* cphone = new SimplePhone("ComplexPhone");
73     Phone* d = new DecoratorPhoneA(cphone);
74     Phone* dpB = new DecoratorPhoneB(d);
75     Phone* dpC = new DecoratorPhoneC(dpB);
76     dpC->ShowDecorate();
77 
78     delete dpa;
79     delete iphone;
80 
81     delete dpA;
82     delete dpb;
83     delete phone;
84 
85     delete d;
86     delete dpB;
87     delete dpC;
88     delete cphone;
89 }
Client

四、结果

Java截图:

2、c++结果截图

原文地址:https://www.cnblogs.com/Lizhichengweidashen/p/15563980.html