[Modèle de conception] Modèle de conception Head First - Implémentation C++ du modèle de décorateur

Le rôle principal des modèles de conception est de trouver des points d’isolement entre les changements et la stabilité, puis de les séparer pour gérer les changements. Verrouillez la monnaie dans une cage comme un lapin et laissez-la sauter dans la cage sans sauter et polluer toute votre pièce.

la pensée de conception

En attachant dynamiquement des responsabilités aux objets, les décorateurs offrent une alternative plus flexible à l'héritage pour étendre les fonctionnalités.

La classe de décoration hérite de la superclasse, et l'héritage consiste à avoir le type correct, et non à hériter du comportement de la superclasse.

Scène d'affaires

Supposons que vous ayez besoin de concevoir un système de vente pour Michelle Ice City. En supposant que toutes les boissons de leur famille n'ont que deux attributs : la description et le prix, vous pouvez penser à utiliser l'héritage pour résoudre le problème : faites d'abord abstraction d'une classe parent de thé au lait, puis chaque thé au lait hérite de la classe parent et implémente son propre affichage. et les méthodes de calcul des coûts.

Vous découvrirez bientôt qu'il y a beaucoup de problèmes à faire ceci : premièrement, le nombre total de tous les types de thé au lait dans ce magasin de thé au lait peut être des dizaines et des centaines, ce qui signifie que vous aurez de très nombreuses sous-catégories ; deuxièmement, telles un design ne semble pas correspondre au scénario commercial actuel. Lorsque les gens commandent du thé au lait, ce n'est pas toujours le même. Certains n'ont pas besoin de perles, d'autres n'ont pas de double sucre, etc., et les assaisonnements et les portions sont Alors comment décrire cette tasse au final ? Le thé au lait et le calcul de son prix deviennent un problème.

exemple de code

#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;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43717839/article/details/132541470
conseillé
Classement