- 浏览: 761699 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
要点
1.继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式
2.应该允许行为可以被扩展,而无须修改现有的代码
3.组合和委托可用于在运行时动态地加上新的行为
4.装饰者模式意味着一群装饰者类,这些类用来包装具体组件
5.装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)
6.装饰者被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
7.你可以用无数个装饰者包装一个组件
8.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
9.装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂
设计原则:类应该对扩展开放,对修改关闭。
Beverage.h
CondimentDecorator.h
HouseBlend.h
Milk.h
Mocha.h
main.cpp
当系统需要新功能的时候,是向旧的类中添加新的代码.这些新加的代码通常装饰了原有类的核心职责或主要行为.它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要.而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有地,按顺序地使用装饰功能包装对象了
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
要点
1.继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式
2.应该允许行为可以被扩展,而无须修改现有的代码
3.组合和委托可用于在运行时动态地加上新的行为
4.装饰者模式意味着一群装饰者类,这些类用来包装具体组件
5.装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)
6.装饰者被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
7.你可以用无数个装饰者包装一个组件
8.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
9.装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂
设计原则:类应该对扩展开放,对修改关闭。
Beverage.h
#ifndef BEVERAGE_H #define BEVERAGE_H #include<string> using namespace std; enum SIZE{ SMALL, MIDDLE, BIG }; class Beverage{ public: explicit Beverage(SIZE size=MIDDLE):mDescription("unknown"),mSize(size){ } virtual string getDescription()const{ return mDescription; } virtual double cost(){ return 0; } virtual SIZE getSize()const{ return mSize; } private: string mDescription; SIZE mSize; }; #endif // BEVERAGE_H
CondimentDecorator.h
#ifndef CONDIMENTDECORATOR_H #define CONDIMENTDECORATOR_H #include"Beverage.h" class CondimentDecorator:public Beverage{ public: virtual string getDescription()const=0; }; #endif // CONDIMENTDECORATOR_H
HouseBlend.h
#ifndef HOUSEBLEND_H #define HOUSEBLEND_H #include"Beverage.h" class HouseBlend:public Beverage{ public: explicit HouseBlend(SIZE size=MIDDLE) :mDescription("HouseBlend"),mPrice(1.2),mSize(size){ } virtual string getDescription()const{ return mDescription; } SIZE getSize()const{ return mSize; } virtual double cost(){ switch(getSize()){ case SMALL: mPrice*=1; break; case MIDDLE: mPrice*=1.2; break; case BIG: mPrice*=1.5; break; } return mPrice; } private: string mDescription; double mPrice; SIZE mSize; }; #endif // HOUSEBLEND_H
Milk.h
#ifndef MILK_H #define MILK_H #include"CondimentDecorator.h" class Milk:public CondimentDecorator{ public: explicit Milk(Beverage* bvg):mDescription("Mile"),mBvg(bvg),mPrice(0.5){ } string getDescription()const{ return mBvg->getDescription()+","+mDescription; } double cost(){ switch(mBvg->getSize()){ case SMALL: mPrice*=1; break; case MIDDLE: mPrice*=1.2; break; case BIG: mPrice*=1.5; break; } return mBvg->cost()+mPrice; } private: string mDescription; Beverage* mBvg; double mPrice; }; #endif // MILK_H
Mocha.h
#ifndef MOCHA_H #define MOCHA_H #include"CondimentDecorator.h" class Mocha:public CondimentDecorator{ public: explicit Mocha(Beverage* bvg):mDescription("Mocha"),mBvg(bvg),mPrice(0.4){ } string getDescription() const{ return mBvg->getDescription()+","+mDescription; } double cost(){ switch(mBvg->getSize()){ case SMALL: mPrice*=1; break; case MIDDLE: mPrice*=1.2; break; case BIG: mPrice*=1.5; break; } return mBvg->cost()+mPrice; } private: string mDescription; Beverage* mBvg; double mPrice; }; #endif // MOCHA_H
main.cpp
#include"Milk.h" #include"HouseBlend.h" #include"Mocha.h" #include<iostream> using namespace std; int main() { Beverage* bvg1 = new HouseBlend(SMALL);//小杯 cout << bvg1->getDescription() << ":" << bvg1->cost() << endl; bvg1 = new Milk(bvg1);//加了牛奶的饮料 cout << bvg1->getDescription() << ":" << bvg1->cost() << endl; bvg1 = new Mocha(bvg1);//加了摩卡的饮料 cout << bvg1->getDescription() << ":" << bvg1->cost() << endl; } HouseBlend:1.2 HouseBlend,Mile:1.7 HouseBlend,Mile,Mocha:2.18
当系统需要新功能的时候,是向旧的类中添加新的代码.这些新加的代码通常装饰了原有类的核心职责或主要行为.它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要.而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有地,按顺序地使用装饰功能包装对象了
#include <iostream> #include <string.h> using namespace std; class House { public: House() { } virtual ~House() { } virtual void display() { cout << "房子:"; } }; class FurnitureHouse:public House { public: FurnitureHouse() { memset(mStr,0,sizeof(mStr)); strcpy(mStr,"床 "); strcat(mStr,"凳子 "); } virtual ~FurnitureHouse(){} virtual void display() { House::display(); cout << mStr; } public: char mStr[128]; }; class TVHourse:public FurnitureHouse { public: TVHourse(House* house) { mHouse = house; strcpy(furStr,"电视 "); } void display() { mHouse->display(); cout << furStr; } private: House* mHouse; char furStr[32]; }; class AirConditionHouse:public FurnitureHouse { public: AirConditionHouse(House* house) { mHouse = house; strcpy(furStr,"空调 "); } void display() { mHouse->display(); cout << furStr; } private: House* mHouse; char furStr[32]; }; int main() { House* house = new FurnitureHouse; cout << "House:" << house << endl; house = new TVHourse(house); house->display(); cout << "TVHouse:" << house << endl; house = new AirConditionHouse(house); house->display(); cout << "AirConditionHouse:" << house << endl; } House:0x93b4978 房子:床 凳子 电视 TVHouse:0x93b4a00 房子:床 凳子 电视 空调 AirConditionHouse:0x93b4ab0
发表评论
-
桥接模式(Bridge)
2014-09-26 15:34 813桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 830访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 673解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 632享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 441中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 582职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 585合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 430组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 558备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 592委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 561建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 623外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 403迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 508原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 333里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 390依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 557开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 554单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
MVC
2011-07-21 17:32 1009MVC是一种复合模式,结合了观察者,策略模式和组合模式。 要 ... -
代理模式(Proxy)
2011-07-19 15:47 921代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ...
相关推荐
装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...
装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...
装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...
装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...
在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...
装饰者模式是软件设计中的一种行为模式,它允许在运行时动态地给对象添加新的行为或职责,而无需改变对象的原始类。这种模式在不违反开闭原则的前提下,提供了扩展对象功能的能力,使得系统更加灵活,易于维护。 在...
装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...
装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...
装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...
装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...