///Decorator 装饰者模式提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。 ///动态地给一个对象添加一些额外的职责或者行为。就增加功能来说, Decorator模式相比生成子类更为灵活。 ///它是通过创建一个包装对象,也就是装饰来包裹真实的对象 ///Decorator 模式除了采用组合的方式取得了比采用继承方式更好的效果,Decorator 模式 还给设计带来一种“即用即付”的方式来添加职责 ///Decorator 模式和 Proxy 模式的相似的地方在于它们都拥有一个指向其他对象的引用 ///为了多态,通过父类指针指向其具体子类,但是这就带来另外一个问题,当具体子类要添加 新的职责,就必须向其父类添加一个这个职责的抽象接口,否则是通过父类指针是调用不到 这个方法了。这样处于高层的父类就承载了太多的特征(方法),并且继承自这个父类的所 有子类都不可避免继承了父类的这些接口,但是可能这并不是这个具体子类所需要的。而在 Decorator 模式提供了一种较好的解决方法,当需要添加一个操作的时候就可以通过 Decorator 模式来解决,你可以一步步添加新的职责。 ///透明性使得你可以递归的嵌套多个装饰,从而可以添加任意多的功能 ///以下情况使用Decorator模式 ///1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 ///2 处理那些可以撤消的职责。 ///3.当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展 void DecoratorTest() { ::Component* com = new ConcreteComponent(); Decorator* dec = new ConcreteDecorator(com); dec->Operation(); delete com; delete dec; }
int main(int argc, char* argv[]) { Component* com = new ConcreteComponent(); Decorator* dec = new ConcreteDecorator(com); dec->Operation(); delete dec; return 0; }
int main(){ Component* pComponent = new ConcreateComponent(); cout << "aaaaaaaaaaaa\n"; Decorator* pDecorator = new ConcreateDecorator(pComponent); cout <<"bbbbbbbbbbbbb\n"; pDecorator->Operation(); cout <<"cccccccccccc\n"; delete pDecorator; return 0; }
int main() { // 初始化一个Component对象 Component* pComponent = new ConcreateComponent(); // 采用这个Component对象去初始化一个Decorator对象, // 这样就可以为这个Component对象动态添加职责 Decorator* pDecorator = new ConcreateDecorator(pComponent); pDecorator->Operation(); delete pDecorator; return 0; }
int main() { // initialize a Componentt object Componentt* pComponent = new ConcreteComponent(); // initialize a Decorator object through the Componentt object. // so the decorator could dynamically add behavior for Componentt. Decorator* pDecorator = new ConcreteDecorator(pComponent); pDecorator->Operation(); delete pDecorator; system("pause"); return 0; }
int main(int argc, char **argv) { LoadData::LoadSuang(); Component* pComponentObj = new ConcreteComponent(); Decorator* pTongJi = new TongJi(pComponentObj); pTongJi->Operation(); std::cout<<"TongJi"<<std::endl; for(int i = 0; i < 10; i++) { S_suang data; GetOneShuang(data); data.Print(); } return 0; //Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj); /* pDecoratorAOjb->Operation(); std::cout<<"============================================="<<std::endl; Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj); pDecoratorBOjb->Operation(); std::cout<<"============================================="<<std::endl; */ //Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb); //pDecoratorBAOjb->Operation(); //std::cout<<"============================================="<<std::endl; /* for(int i = 0; i < 10; i++) { std::cout<<GetOneNumber(1, 32)<<std::endl; } */ }
int main(int argc, char const *argv[]) { //调用方法1 Component *com=new ConComponent(); //Decorator *dec=new ConDecorator(com); Decorator *ss= new ConDecoratorB(com); ss->Operation(); cout<<"--------------"<<endl; //调用方法2 Decorator *dd = new ConDecorator( new ConDecoratorB( new ConComponent())); dd->Operation(); delete ss; delete dd; return 0; }