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