admin管理员组文章数量:1794759
Strategy 模式(策略模式)
策略模式
定义一系列算法,分别封装,并且使他们可以相互替换(变化)。该模式使得算法「独立」于使用他的客户程序(稳定)而变化。
动机软件构造过程中,某些对象使用的算法多种多样,经常改变。如果将算法都编码到对象中,会使得对象异常复杂且冗余。 策略模式能够在运行时根据需求透明的更改对象的算法,将算法与对象解耦合。
适用场景1、如果在一个系统里由很多类,而这些类之间的区别仅是行为不同,那就需要用策略模式来让对象动态的在许多行为中选择一个行为。 2、一个系统需要动态的在几种算法中选择一种。 3、如果一个对象有很多的行为,如果使用不恰当的模式,这些行为就只好使用多重的条件语句来实现。
实例1、鸭子游戏; 2、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 3、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
优点:1、算法可以自由切换 。 2、避免使用多重条件判断 。 3、扩展性好。
缺点1、策略类会很多。 2、所有策略类都需要对外暴露。
结构图 代码 #pragma once // -----------------------策略模式------------------------- // 策略基类 class Strategy { public: virtual void algorithm() = 0; }; class Factory { public: virtual Strategy* mopNewStrategy() = 0; }; // 策略1 class Strategy1 : public Strategy { public: virtual void algorithm() {} }; class Factory1 : public Factory { public: virtual Strategy* mopNewStrategy() { return new Strategy1; } }; // 策略2 class Strategy2 : public Strategy { public: virtual void algorithm() {} }; class Factory2 : public Factory { public: virtual Strategy* mopNewStrategy() { return new Strategy2; } }; // ---------- 变化 ---------- // 策略3 class Strategy3 : public Strategy { public: virtual void algorithm() {} }; class Factory3 : public Factory { public: virtual Strategy* mopNewStrategy() { return new Strategy3; } }; // ---------- 稳定 ---------- class Context { public: Context(Factory* opFactory) { mopStrategy = opFactory->mopNewStrategy(); // 动态创建策略对象 } void contextFunc() { mopStrategy->algorithm(); // 动态执行策略对应算法 } private: Strategy* mopStrategy; }; // ------------------------- void test() { // 策略1 Factory1 f1; Context c1(&f1); // 策略1 Factory2 f2; Context c2(&f2); // 变化:策略3 Factory3 f3; Context c3(&f3); }版权声明:本文标题:Strategy 模式(策略模式) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1687003831a127636.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论