
装饰者模式的作用在于动态地为某一个类添加额外的功能,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
适用场景:
1.需要扩展一个类的功能,或给一个类添加附加职责。
2.需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3.需要增加由一些基本功能的排列组合而产生的非常大量的功能。
4.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
案例:买私家车,车辆的某一款会有不同的配置,用户根据需要添加这些配置,每项配置都会为车辆收取额外费用。
一.C++实现
1 #include <iostream>
2
3 using namespace std;
4
5 //车辆接口类
6 class ICar{
7 public:
8 virtual int getPrice() = 0;
9 virtual string getName() = 0;
10 };
11
12 //未进行装饰的简单车辆类
13 class Car:public ICar{
14 public:
15 int getPrice(){
16 return 100000;
17 }
18 string getName(){
19 return "基础款";
20 }
21 };
22
23 //车辆装饰者基类
24 class CarDecorator:public ICar{
25 protected:
26 ICar* m_car;
27 public:
28 CarDecorator(ICar* pCar){
29 m_car = pCar;
30 }
31 string getName(){
32 this->getName();
33 }
34 int getPrice(){
35 this->getPrice();
36 }
37 };
38
39 /**车辆装饰者的具体实现**/
40 //车载智能Pad
41 class PadDecorator:public CarDecorator
42 {
43 public:
44 PadDecorator(ICar* pCar):CarDecorator(pCar) {}
45 string getName(){
46 return m_car->getName() + " 搭载智能Pad";
47 }
48 int getPrice(){
49 return m_car->getPrice() + 15000;
50 }
51 };
52
53 //涡轮增压发动机
54 class TurboChargedEngineDecorator:public CarDecorator
55 {
56 public:
57 TurboChargedEngineDecorator(ICar* pCar):CarDecorator(pCar) {}
58 string getName(){
59 return m_car->getName() + " 搭载涡轮增压发动机";
60 }
61 int getPrice(){
62 return m_car->getPrice() + 20000;
63 }
64 };
65
66 //手自一体变速箱
67 class AMTDecoratorICar:public CarDecorator{
68 public:
69 AMTDecoratorICar(ICar* pCar):CarDecorator(pCar) {}
70 string getName(){
71 return m_car->getName() + " 搭载手自一体变速箱";
72 }
73 int getPrice(){
74 return m_car->getPrice() + 10000;
75 }
76 };
77
78 int main()
79 {
80 Car* car = new Car();
81 CarDecorator* carWithPad = new PadDecorator(car);
82 CarDecorator* carWithPadAndAMT = new AMTDecoratorICar(carWithPad);
83 CarDecorator* carMaxMatching = new TurboChargedEngineDecorator(carWithPadAndAMT);
84 cout << car->getName() << endl;
85 cout << "价格" << car->getPrice() << endl;
86 cout << carWithPad->getName() << endl;
87 cout << "价格" << carWithPad->getPrice() << endl;
88 cout << carMaxMatching->getName() << endl;
89 cout << "价格" << carMaxMatching->getPrice() << endl;
90 return 0;
91 }
输出:
基础款
价格100000
基础款 搭载智能Pad
价格115000
基础款 搭载智能Pad 搭载手自一体变速箱 搭载涡轮增压发动机
价格145000
二.JAVA实现
1 public interface ICar {
2 public int getPrice();
3 public String getName();
4 }
5
6 public class Car implements ICar {
7 @Override
8 public int getPrice() {
9 return 100000;
10 }
11
12 @Override
13 public String getName() {
14 return "基础款";
15 }
16 }
17
18 public abstract class Decorator implements ICar{
19
20 protected ICar car;
21
22 public Decorator(ICar icar){
23 car = icar;
24 }
25
26 @Override
27 public int getPrice() {
28 return car.getPrice();
29 }
30
31 @Override
32 public String getName() {
33 return car.getName();
34 }
35 }
36
37 public class AMTDecorator extends Decorator {
38
39 AMTDecorator(ICar iCar){
40 super(iCar);
41 }
42
43 @Override
44 public int getPrice() {
45 return super.getPrice() + 10000;
46 }
47
48 @Override
49 public String getName(){
50 return super.getName() + " 搭载手自一体变速器";
51 }
52 }
53
54 public class PadDecorator extends Decorator {
55
56 PadDecorator(ICar iCar){super(iCar);}
57
58 @Override
59 public String getName() {
60 return super.getName() + " 搭载智能Pad";
61 }
62
63 @Override
64 public int getPrice() {
65 return super.getPrice() + 15000;
66 }
67 }
68
69 public class TurboChargeEngineDecorator extends Decorator {
70
71 TurboChargeEngineDecorator(ICar iCar){
72 super(iCar);
73 }
74
75 @Override
76 public String getName() {
77 return super.getName() + " 搭载涡轮增压发动机";
78 }
79
80 @Override
81 public int getPrice() {
82 return super.getPrice() + 20000;
83 }
84 }
85
86 public class Main {
87
88 public static void main(String[] args) {
89 Car car = new Car();
90 Decorator car1 = new PadDecorator(car);
91 Decorator car2 = new AMTDecorator(car1);
92 Decorator car3 = new TurboChargeEngineDecorator(car2);
93 System.out.println(car.getName());
94 System.out.println("价格" + car.getPrice());
95 System.out.println(car1.getName());
96 System.out.println("价格" + car1.getPrice());
97 System.out.println(car3.getName());
98 System.out.println("价格" + car3.getPrice());
99 }
100
101 }
输出:
基础款
价格100000
基础款 搭载智能Pad
价格115000
基础款 搭载智能Pad 搭载手自一体变速箱 搭载涡轮增压发动机
价格145000
来源:https://www.cnblogs.com/Asp1rant/p/10816076.html