两种语言实现设计模式(C++和Java)(六:装饰者模式)

装饰者模式的作用在于动态地为某一个类添加额外的功能,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

适用场景:

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

 

 

 

posted @ 2019-05-05 20:34  Asp1rant  阅读(207)  评论(0编辑  收藏  举报