1,核心:装饰者和被装饰者来自共同的基类.
被装饰者由装饰者一层层地进行包裹.
2,实例代码:
#include <iostream>
#include <list>
#include <cassert>
using namespace std;
class Beverage //装饰者和被装饰者共同的基类
{
protected:
Beverage() : _description( "Unknown Beverage" )
{}
public:
virtual ~Beverage() = 0;
virtual std::string getDescription() const
{
return _description;
}
virtual double cost() const = 0;
protected:
string _description;
};
Beverage::~Beverage() {}
/*****************************装饰者基类*************************************/
class CondimentDecorator : public Beverage
{
protected:
CondimentDecorator() {}
private:
CondimentDecorator( const CondimentDecorator& ); // Disable copy constructor
void operator=( const CondimentDecorator& ); // Disable assignment operator
public:
virtual ~CondimentDecorator() = 0;
virtual string getDescription() const = 0;
};
CondimentDecorator::~CondimentDecorator() {}
/*****************************装饰者*************************************/
class Milk : public CondimentDecorator
{
public:
explicit Milk( const Beverage* beverage ) :
_beverage( beverage )
{
assert( beverage );
}
~Milk()
{
delete _beverage;
}
string getDescription() const
{
return _beverage->getDescription() + ", Milk";
}
double cost() const
{
return 0.10 + _beverage->cost(); //这里是核心
}
private:
const Beverage* _beverage;
};
class Whip : public CondimentDecorator
{
public:
explicit Whip( const Beverage* beverage ) :
_beverage( beverage )
{
assert( beverage );
}
~Whip()
{
delete _beverage;
}
string getDescription() const
{
return _beverage->getDescription() + ", Whip";
}
double cost() const
{
return 0.10 + _beverage->cost();
}
private:
const Beverage* _beverage;
};
class Mocha : public CondimentDecorator
{
public:
explicit Mocha( Beverage* beverage ) :
_beverage( beverage )
{
assert( beverage );
}
~Mocha()
{
delete _beverage;
}
string getDescription() const
{
return _beverage->getDescription() + ", Mocha";
}
double cost() const
{
return 0.20 + _beverage->cost();
}
private:
const Beverage* _beverage;
};
class Soy : public CondimentDecorator
{
public:
explicit Soy( const Beverage* beverage ) :
_beverage( beverage )
{
assert( beverage );
}
~Soy()
{
delete _beverage;
}
string getDescription() const
{
return _beverage->getDescription() + ", Soy";
}
double cost() const
{
return 0.15 + _beverage->cost();
}
private:
const Beverage* _beverage;
};
/*****************************被装饰者*************************************/
class DarkRoast : public Beverage
{
public:
DarkRoast()
{
_description = "Dark Roast Coffee";
}
double cost() const
{
return 0.99;
}
};
class Decaf : public Beverage
{
public:
Decaf()
{
_description = "Decaf Coffee";
}
double cost() const
{
return 1.05;
}
};
class Espresso : public Beverage
{
public:
Espresso()
{
_description = "Espresso";
}
double cost() const
{
return 1.99;
}
};
class HouseBlend : public Beverage
{
public:
HouseBlend()
{
_description = "House Blend Coffee";
}
double cost() const
{
return 0.89;
}
};
int main()
{
Beverage* beverage = new Espresso();
cout.setf( ios::showpoint);
cout.precision(3);
cout << beverage->getDescription()
<< " $"
<< beverage->cost()
<< endl;
Beverage* beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2); //加咖啡
beverage2 = new Mocha(beverage2); //加双份咖啡
beverage2 = new Whip(beverage2); //加麦
cout << beverage2->getDescription()
<< " $"
<< beverage2->cost()
<< endl;
Beverage* beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
cout << beverage3->getDescription()
<< " $"
<< beverage3->cost()
<< endl;
delete beverage3;
delete beverage2;
delete beverage;
return 0;
}
分享到:
相关推荐
【Decorator模式】是一种设计模式,它允许在运行时动态地给对象添加新的责任或功能,而不必通过子类化的方式。在上述的奇幻RPG游戏中,Decorator模式被用来实现武器的锻造过程,尤其是武器镶嵌宝石的功能。这个过程...
Decorator模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在Java中尤其有用,因为它提供了在不改变类结构的情况下扩展类的功能的方法。以下是对Decorator模式的详细...
Decorator模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在Java和其他面向对象编程语言中非常常见,尤其在需要灵活扩展功能而不影响原有类结构的情况下。 在给定...
### Java类库中Decorator模式的应用研究 #### 一、引言 随着软件开发技术的不断发展,设计模式在软件工程中的重要性日益凸显。设计模式能够帮助开发者构建出具有良好结构、高度可扩展性和易于维护的软件系统。其中...
Decorator模式是一种设计模式,主要用来在不改变原有对象的基础上,动态地给对象添加新的行为或属性,从而扩展其功能。这种模式在Java等面向对象语言中广泛应用,它提供了一种比继承更加灵活的扩展机制。 在Java中...
Decorator模式是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的行为或职责,而不会破坏封装性。这种模式的核心思想是通过装饰类包装原对象,实现对原对象功能的扩展,同时保持与原接口的一致性。 ...
DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及Java EE 5.0、Java IO 包中的Decorator模式等。
Java设计模式中的装饰模式(Decorator模式)是一种结构型设计模式,它允许在运行时向对象添加新的行为或责任,而不必通过子类化的方式。这种模式对于系统扩展性和灵活性至关重要,因为它避免了创建大量子类来实现...
提供一种修改类的行为,而避免创建众多的派生类的途径。
Decorator模式的核心在于动态地将责任附加到对象上,通过封装来增加新的行为或职责,使得装饰者和组件(被装饰对象)具有相同的接口,这样就可以透明地对对象进行装饰。 在Java中,Decorator模式通常通过继承和组合...
装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...
猴王学艺的过程,就如同我们在编程中逐步增加对象的能力,通过不同的装饰,猴王学会了七十二般变化,这正是Decorator模式的体现——对象在不改变自身的情况下,通过装饰来获得新能力。 在配套代码中,我们可以看到...
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
Java装饰模式,也被称为Decorator模式,是一种设计模式,它允许在运行时向对象添加新的行为或职责,而不必通过继承的方式来扩展类。这种模式提供了一种比使用子类更加灵活的方式来扩展对象的功能。 装饰模式的核心...
Decorator模式的核心思想是装饰者类与被装饰类有相同的接口,它包装了一个对象,并且可以增加或修改该对象的行为。这种模式避免了对原有类进行大量修改,保持了代码的开放性和封闭性。在Java IO系统中,所有的流类都...
本文研究的主要是python实现Decorator模式,具体介绍如下。 一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类)。首先来看一个简单的例子: # -*- coding: utf-8 -*- ...