[Patrón de diseño] Patrón de diseño Head First: implementación en C ++ del patrón decorador

La función más importante de los patrones de diseño es encontrar puntos de aislamiento entre los cambios y la estabilidad, y luego separarlos para gestionar los cambios. Encierra el cambio en una jaula como un conejito y déjalo saltar dentro de la jaula sin saltar y contaminar toda tu habitación.

el pensamiento de diseño

Al asignar dinámicamente responsabilidades a los objetos, los decoradores proporcionan una alternativa más flexible a la herencia para ampliar la funcionalidad.

La clase de decoración hereda de la superclase, y la herencia es para tener el tipo correcto, no para heredar el comportamiento de la superclase.

escena empresarial

Suponga que necesita diseñar un sistema de ventas para Michelle Ice City. Suponiendo que todas las bebidas de su familia tienen solo dos atributos: descripción y precio, puede pensar en usar la herencia para resolver el problema: primero abstraiga una clase principal de té con leche y luego cada té con leche herede la clase principal e implemente su propia visualización. y métodos de costos.

Pronto descubrirá que hay muchos problemas al hacer esto: en primer lugar, el número total de todos los tipos de té con leche en esta tienda de té con leche puede ser docenas y cientos, lo que significa que tendrá muchas, muchas subcategorías; en segundo lugar, tales Un diseño no parece estar acorde con el escenario real del negocio. Cuando la gente pide té con leche, no siempre es lo mismo. Algunos no necesitan perlas, otros no tienen doble azúcar, etc., y los condimentos y las porciones son Entonces, ¿cómo describir al final esta taza? El té con leche y calcular su precio se convierten en un problema.

ejemplo de código

#include<iostream>
#i#include<iostream>
#include<vector>
#include<algorithm>
#include <string>
#include <memory>
 
//饮料抽象类
class Beverage {
public:
	virtual ~Beverage() {};
	virtual std::string getDescription() = 0;
	virtual double cost() = 0;
protected:
	std::string description;
	
};
//调料装饰者类
class Condimentecorator :public Beverage {
public:
	virtual ~Condimentecorator() {};
	virtual std::string getDescription() = 0;
};
 
//espresso 饮料类
class Espresso :public Beverage {
public:
	Espresso() :Beverage()
	{
		description = "Espresso";
	}
	std::string getDescription() { return description; }
	double cost() 
	{
		return 1.99;
	}
};
 
//houseblend 饮料类
class HouseBlend :public Beverage {
public:
	HouseBlend() :Beverage()
	{
		description = "HouseBlend";
	}
	std::string getDescription() { return description; }
	double cost() 
	{
		return 0.89;
	}
};
 
//DarkRoast 饮料类
class DarkRoast :public Beverage {
public:
	DarkRoast() :Beverage()
	{
		description = "DarkRoast";
	}
	std::string getDescription() { return description; }
	double cost() 
	{
		return 0.99;
	}
};
 
//Decat 饮料类
class Decat :public Beverage {
public:
	Decat() :Beverage()
	{
		description = "Decat";
	}
	std::string getDescription() { return description; }
	double cost()
	{
		return 1.05;
	}
};
 
//Mocha调料装饰者
class Mocha :public Condimentecorator {
 
public:
	Mocha(std::shared_ptr<Beverage> be) :Condimentecorator(), beverage(be) {}
	std::string getDescription() 
	{
		return (beverage->getDescription() + " Mocha");
	}
	double cost()
	{
		return 0.2 + beverage->cost();
	}
 
public:
	std::shared_ptr<Beverage> beverage;
};
 
//Soy调料装饰者
class Soy :public Condimentecorator {
public:
	Soy(std::shared_ptr<Beverage> be):Condimentecorator(),beverage(be){}
	std::string getDescription()
	{
		return (beverage->getDescription() + " Soy");
	}
	double cost()
	{
		return 0.15 + beverage->cost();
	}
public:
	std::shared_ptr<Beverage> beverage;
};
 
//Whip调料装饰者
class Whip :public Condimentecorator {
public:
	Whip(std::shared_ptr<Beverage> be) :Condimentecorator(), beverage(be) {}
	std::string getDescription()
	{
		return (beverage->getDescription() + " Whip");
	}
	double cost()
	{
		return 0.10 + beverage->cost();
	}
public:
	std::shared_ptr<Beverage> beverage;
};
 
int main()
{
	std::shared_ptr<Beverage> beverage = std::make_shared<Espresso>();
	std::cout << beverage->getDescription()<<" costs: "<<beverage->cost() << std::endl;
 
	std::shared_ptr<Beverage> beverage2 = std::make_shared<DarkRoast>();
	std::cout << beverage2->getDescription() << " costs: " << beverage2->cost() << std::endl;
 
    beverage2 = std::make_shared<Mocha>(beverage2);
	std::cout << beverage2->getDescription() << " costs: " << beverage2->cost() << std::endl;
 
    beverage2 = std::make_shared<Mocha>(beverage2);
	std::cout << beverage2->getDescription() << " costs: " << beverage2->cost() << std::endl;
 
	beverage2 = std::make_shared<Whip>(beverage2);
	std::cout << beverage2->getDescription() << " costs: " << beverage2->cost() << std::endl;

	auto it = std::make_shared<Whip>(beverage2);
	std::cout << it->cost() << " " << it->getDescription() << std::endl;
	std::cout << it->beverage->cost() << " " << it->beverage->getDescription() << std::endl;

	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43717839/article/details/132541470
Recomendado
Clasificación