int main(int argc, char *argv[]) { Strategy *psA = new ConcreteStrategyA(); Strategy *psB = new ConcreteStrategyB(); Context pcA = Context(psA); Context pcB = Context(psB); pcA.DoAction(); pcB.DoAction(); delete psA; delete psB; return 0; }
void test_strategy() { Strategy* stg = new ConcreteStrategyA; Context* ctt = new Context(stg); ctt->DoAction(); delete stg; delete ctt; }
int main(int argc, char* argv[]) { Strategy* ps; ps = new ConcreteStrategyA(); Context* pc = new Context(ps); pc->DoAction(); if(NULL!=pc) delete pc; return 0; }
int main(int argc, char *argv[]) { /* Strategy模式和Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区别。 要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。 组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。 这两种方式各有优缺点 */ //策略A与B可替换 Strategy* pStr = new ConcreteStrategyA(); Context* pcon = new Context(pStr); pcon->DoAction(); pStr = new ConcreteStrategyB(); pcon = new Context(pStr); pcon->DoAction(); std::cin.get(); return 0; }
///Strategy 策略模式则通过组合(委托) 来达到和 Template 模式类似的效果,其代价就是空间和时间上的代价 ///Strategy 模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算 法)具体实现和抽象接口之间的解耦。Strategy 模式将逻辑(算法)封装到一个类(Context) 里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口 的实现委托给组合对象实现。State 模式也有类似的功能 //////Bridge模式和Strategy模式相似就是因为他们都将任务委托给了另外一个接口的具体实现,他们之间的区别在于Bridge的目的是让底层实现和上层接口可以分别演化,从而提高移植性而Strategy的目的是将复杂的算法封装起来,从而便于替换不同的算法。 ///以相对策略模式,桥接模式要表达的内容要更多,结构也更加复杂。桥接模式表达的主要意义其实是接口隔离的原则,即把本质上并不内聚的两种体系区别 开来,使得它们可以松散的组合,而策略在解耦上还仅仅是某一个算法的层次,没有到体系这一层次。从结构图中可以看到,策略的结构是包容在桥接结构中的,桥接中必然存在着策略模式 void StrategyTest() { Strategy* ps = new ConcreteStrategyA(); Context* pc = new Context(ps); pc->DoAction(); }