装饰器模式
在原来的基础上,增加一个功能。
比如有个手机类,你可以写个抽象的装饰器类,该类中加入个手机类的成员,因为后期要用到这个手机类,且无法被更改,则可用protected:成员。
假如要写个手机贴膜的装饰器,则可继承写好的装饰器,然后对相应的虚函数功能进行重写。
代码示例:
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <iostream>
3
4 using namespace std;
5
6 //抽象的手机类
7 class Phone
8 {
9 public:
10 virtual void show() = 0;
11 };
12
13 class iPhone :public Phone
14 {
15 public:
16 virtual void show() {
17 cout << "秀出了iphone" << endl;
18 }
19 };
20
21 class Mi :public Phone
22 {
23 virtual void show() {
24 cout << "秀出了小米手机" << endl;
25 }
26 };
27
28 //写一个抽象的装饰器
29 class Decorator :public Phone
30 {
31 public:
32 Decorator(Phone *phone) {
33 this->phone = phone;
34 }
35
36 virtual void show() = 0;
37 protected:
38 Phone * phone; //拥有一个 所有手机的父类指针
39 };
40
41 //具体的手机贴膜装饰器
42 class MoDecorator :public Decorator
43 {
44 public:
45 MoDecorator(Phone *phone) : Decorator(phone) {}
46 virtual void show() {
47 this->phone->show(); //保持原有的show
48
49 this->mo(); //额外添加一个 mo的方法
50 }
51
52 //膜装饰器,可以修饰添加的方法
53 void mo() {
54 cout << "手机有了贴膜" << endl;
55 }
56 };
57
58 //皮套的装饰器类
59 class TaoDecorator :public Decorator
60 {
61 public:
62 TaoDecorator(Phone *phone) : Decorator(phone) {}
63 virtual void show() {
64 this->phone->show();
65 tao();
66 }
67
68 void tao() {
69 cout << "手机有了皮套" << endl;
70 }
71 };
72
73
74
75 int main(void)
76 {
77 Phone *phone = new iPhone;
78 phone->show();
79 cout << " ----- " << endl;
80 Phone * moPhone = new MoDecorator(phone);
81 moPhone->show();
82 cout << " ----- " << endl;
83 Phone * taoPhone = new TaoDecorator(phone);
84 taoPhone->show();
85
86 cout << " ------ " << endl;
87 Phone *moTaoPhone = new TaoDecorator(moPhone);
88 moTaoPhone->show(); //moPhone.show() + tao() == phone.show() + mo() + tao();
89
90
91 return 0;
92 }
举个英雄联盟的例子:
代码:
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <iostream>
3
4 using namespace std;
5
6 class Hero
7 {
8 public:
9 virtual void status() = 0;
10 };
11
12 class Akali :public Hero
13 {
14 public:
15 virtual void status() {
16 cout << "HP: 1000" << endl;
17 cout << "AP: 500" << endl;
18 cout << "AD: 50" << endl;
19 }
20 };
21
22 //英雄的装饰器
23 class Decorator :public Hero
24 {
25 public:
26 Decorator(Hero *hero){
27 this->hero = hero;
28 }
29 virtual void status() = 0;
30
31 protected:
32 Hero *hero;
33 };
34
35 //日炎斗篷的装饰器
36 class RYDecorator :public Decorator
37 {
38 public:
39 RYDecorator(Hero *hero) : Decorator(hero) {}
40 virtual void status() {
41 this->hero->status(); //先调用被装饰的 英雄的基本状态
42
43 cout << "HP + 100000" << endl;
44 }
45
46 };
47
48 //深渊权杖的装备装饰器
49 class SYQZDecorator :public Decorator
50 {
51 public:
52 SYQZDecorator(Hero *hero) : Decorator(hero) {}
53 virtual void status() {
54 this->hero->status();
55
56 cout << "AP +50000 " << endl;
57 }
58 };
59
60 int main(void)
61 {
62 Hero *akali = new Akali;
63 cout << "akali的初始状态" << endl;
64 akali->status();
65
66 cout << "通过日然斗篷创建新的akali" << endl;
67 Hero *ryAkali = new RYDecorator(akali);
68 ryAkali->status();
69
70 cout << "再通过 深渊权杖的装备装饰器 修饰日炎akali" << endl;
71 Hero *syAkali = new SYQZDecorator(ryAkali);
72 syAkali->status();
73
74 return 0;
75 }