设计模式Before-after之装饰模式

来源:互联网 发布:银联快捷支付 网络支付 编辑:程序博客网 时间:2024/05/01 14:26

before.cxx

#include <iostream>class RobotCat {public:void cry(void) {std::cout << "Meow! Meow! Meow!" << std::endl;}};class RobotCatCanWalk: public RobotCat {public:void walk(void) {std::cout << "Walking..." << std::endl;}};class RobotCatCanTalk: public RobotCat {public:void talk(void) {std::cout << "Talking..." << std::endl;}};class RobotDog {public:void cry(void) {std::cout << "Woof! Woof! Woof!" << std::endl;}};class RobotDogCanWalk: public RobotDog {public:void walk(void) {std::cout << "Walking..." << std::endl;}};class RobotDogCanTalk: public RobotDog {public:void talk(void) {std::cout << "Talking..." << std::endl;}};int main(void) {RobotCatCanTalk robotCatCanTalk;robotCatCanTalk.cry();robotCatCanTalk.talk();RobotCatCanWalk robotCatCanWalk;robotCatCanWalk.cry();robotCatCanWalk.walk();// RobotDogCanTalk robotDogCanTalk;// robotDogCanTalk.cry();// robotDogCanTalk.talk();// RobotDogCanWalk robotDogCanWalk;// robotDogCanWalk.cry();// robotDogCanWalk.walk();return 0;}

after.cxx

#include <iostream>#include "config.hxx"class RobotPet {public:virtual void cry(void) = 0;};class RobotCat: public RobotPet {public:void cry(void) {std::cout << "Meow! Meow! Meow!" << std::endl;}};class RobotDog: public RobotPet {public:void cry(void) {std::cout << "Woof! Woof! Woof!" << std::endl;}};class RobotPetDecorator: public RobotPet {public:RobotPetDecorator(RobotPet &robotPet): robotPet(robotPet) {}void cry(void) {robotPet.cry();}private:RobotPet &robotPet;};class RobotPetCanTalk: public RobotPetDecorator {public:RobotPetCanTalk(RobotPet &robotPet): RobotPetDecorator(robotPet) {}void talk(void) {std::cout << "Talking..." << std::endl;}};class RobotPetCanWalk: public RobotPetDecorator {public:RobotPetCanWalk(RobotPet &robotPet): RobotPetDecorator(robotPet) {}void walk(void) {std::cout << "Walking..." << std::endl;}};int main(void) {RobotPetCanTalk robotPetCanTalk(*&_ROBOT_PET_());robotPetCanTalk.cry();robotPetCanTalk.talk();RobotPetCanWalk robotPetCanWalk(*&_ROBOT_PET_());robotPetCanWalk.cry();robotPetCanWalk.walk();}


config.hxx

#define _ROBOT_PET_ RobotCat// #define _ROBOT_PET_ RobotDog


0 0