策略模式

22.策略模式

≯℡__Kan透↙ 提交于 2019-11-28 07:17:46
一、角色 环境类(Context):对策略进行管理 抽象策略类(Strategy):所有策略类的抽象接口 具体策略类(ConcreteStrategy):具体策略实现类 二、适用场景 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为 一个系统需要动态地在几种算法中选择一种 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性 三、实例 图1是一个两个整数运算的实例,不同的策略对应了两个数字不同的运算方式(例如加减乘除),Strategy是抽象策略类角色(这里用JAVA接口实现),OperationAdd、OperationSubstract、OperationMultiply为具体策略类,分别实现两个整数的加减乘操作,Context则是环境类,可以用来设置当前策略和调用具体策略的算法 代码地址: https://github.com/lanhei/DesignPattern/tree/master/src/com/lanhei/patterns/strategy 图-1 来源: https://www.cnblogs.com/zhongj/p/11398461

如何用卫语句、策略模式、状态模式重构if-else语句

Deadly 提交于 2019-11-28 06:02:24
《java开发手册》中: 况且日常开发时遇到一推的if-else着实让人头疼! so,现在开始改造 一、卫语句 卫语句就是把复杂的条件表达式拆分成多个条件表达式,即代码逻辑先考虑失败、异常、中断、退出等直接返回的情况,以方法多个出口的方式,解决代码中判断分支嵌套的问题,这是逆向思维的体现 比如: if (type == 0) { code... }else if (type == 1) { code... } else if (type == 2) { code... } else { otherCode... } 可以改造为: if (type == 0) {    code...   return; } if (type == 1) {    code...   return; } if (type == 2) { code... return; } otherCode.... 二、策略模式  如果不了解策略模式,可以去看下菜鸟教程中的例子,简单明了,地址: https://www.runoob.com/design-pattern/strategy-pattern.html 现在有个需求,根据用户的类型来展示不同的内容,我们将其具体化为一段代码: if ("新客户".equals(userType)) {   showNewContent...; }else if(

设计模式之-策略模式

半城伤御伤魂 提交于 2019-11-28 05:26:43
场景引入:   小镇的咖啡馆生意越来越好了,但是来自不同地方的顾客也越来越多,有的人喜欢咖啡加糖,有的人喜欢咖啡加牛奶,有的喜欢加炼乳。。。 咖啡伪代码: class 咖啡{ void addSth(String param){ if(param.equals("糖")){ System.out.println("咖啡加糖。。。。"); }else if(param.equals("牛奶")){ System.out.println("咖啡牛奶。。。。"); } } } 每次出一种新品种,都要在if..else if..后添加,违反了对开闭原则的,对修改关闭的原则。 我们可以尝试以下策略模式来解决这个问题。 1.声明一个策略接口; 2.往后只要新增加一种口味,都生成一种新的具体策略实现类; 3.在生成咖啡时,将具体的策略赋值给咖啡,就可以生成不同口味的咖啡啦! 是不是听起来很棒,那我们来看一下具体的代码实现吧 代码展示: 策略接口: //策略接口 interface Strategy{ void add(); } 加糖策略: //加糖策略 class SugarStrategy implements Strategy{ public void add(){ System.out.println("add Sugar...."); } } 加牛奶策略: //加牛奶策略 class

策略模式

瘦欲@ 提交于 2019-11-28 05:05:43
简介:   指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法   对象具有某种行为,但是在不同的场景中,该行为会有不同的算法实现。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 组成: 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。 具体策略角色:包装了相关的算法和行为。 环境角色:持有一个策略类的引用,最终给客户端调用。 应用场景: 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。 3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。 代码举例:    旅游出行,交通工具有飞机(Airplane)、火车(Train)、骑自行车(Bicycle)。 1 /** 2 * 策略模式 3 * 定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。 4 * 本模式使得算法可独立于使用它的客户变化 5 */ 6 public interface TravelStrategy { 7 8 void travel(); 9 } 1 /** 2 * 具体策略一:乘坐飞机 3 */ 4 public class AirPlaneStrategy implements

华为防火墙及它的工作原理

两盒软妹~` 提交于 2019-11-28 04:32:19
一、华为防火墙产品介绍 USG2000、USG5000、USG6000和USG9500构成了华为防火墙的四大部分,分别适合于不同环境的网络需求,其中,USG2000和USG5000系列定位于UTM(统一威胁管理)产品,USG6000系列属于下一代防火墙产品,USG9500系列属于高端防火墙产品。 1、USG2110 USG2110为华为针对中小企业及连锁机构,SOHO企业等发布的防火墙设备,其功能涵盖防火墙,UTM、Virtual Private Network(请自行看首字母,我写简写的话就被和谐了)、路由、无线等。USG2110其具有性能高、可靠性高、配置方便等特性,且价格相对较低,支持多种Virtual Private Network组网方式,为用户提供安全、灵活、便捷的一体化组网解决方案。 2、USG6600 USG6600是华为面向下一代网络环境防火墙产品,适用于大中型企业及数据中心等网络环境,具有访问控制精准、防护范围全面、安全管理简单、防护性能高等特点,可进行企业内网边界防护、互联网出口防护、云数据中心边界防护、Virtual Private Network远程互联等组网应用。 3、USG9500 USG9500系列包含USG9520、USG9560、USG9580三种系列,适用于云服务提供商、大型数据中心、大型企业园区网络等。它拥有最精准的访问控制

Java策略模式(思维导图)

北城以北 提交于 2019-11-28 02:46:36
图1 策略模式【点击查看大图】 1,描述   在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。   在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决: 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。 何时使用: 一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决: 将这些算法封装成一个一个的类,任意地替换。 关键代码: 实现同一个接口。 应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式

java设计模式----策略模式

亡梦爱人 提交于 2019-11-27 23:52:40
策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式的好处在于你可以动态的改变对象的行为。 策略模式主要有三个对象:抽象策略对象(它可由接口或抽象类来实现。),具体策略对象(它封装了实现同不功能的不同算法。),环境对象(该类中实现了对抽象策略中定义的接口或者抽象类的引用。) 具体代码 抽象接口 package strategy; public interface TravelStrategy { public void travelAlgorithm(); } 具体实现类坐火车类 package strategy; public class TrainStrategy implements TravelStrategy{ @Override public void travelAlgorithm() { System.out.println("i'm travel by train"); } } 具体实现类坐飞机类 package strategy; public class AirStrategy implements TravelStrategy{ @Override public void travelAlgorithm() { System.out.println("i'm travel by

java设计模式----状态模式

风流意气都作罢 提交于 2019-11-27 23:50:06
 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。 状态模式允许一个对象在其内部状态改变的时候改变其行为。 策略模式和状态模式有点相似,区别就是状态模式是行为改变状态,主要在于状态改变行为的应用场景,而策略模式则是采用哪种算法,让Context去实现哪种算法,决定权在于客户端。 状态模式 的行为是 平行的,不可相互替换的 ;而 策略模式 的行为是 平等性的,是可以相互替换的 。 主要有三个角色: 环境角色(Context):保留客户端所需要的一些接口,并保留一个具体状态类的实例。 package design.state; public class Context { private State state; public void setState(State state) { this.state = state; } //定义客户端调用接口 public void request(String para){ state.handle(para); } }    抽象状态角色(State):作为一个接口,封装环境对象的一个特定的状态所对应的行为。 package design.state; public interface State { public void handle(String para); }  

设计模式之策略模式

大城市里の小女人 提交于 2019-11-27 19:27:33
  今天我们来看一下策略模式。在真正介绍策略模式之前呢,我们先通过一个非常生动有趣的例子的引入。   我们现在有一个模拟鸭子的程序。   1、鸭子父类如下: public abstract class Duck { /** * 呱呱叫行为(所有鸭子都会) */ public void quack() { System.out.println("呱呱叫"); } /** * 游泳行为(所有鸭子都会) */ public void swim() { System.out.println("游泳"); } /** * 每个鸭子额外观都不同 所以display是抽象方法 */ abstract void display(); }   MallardDuck子类 public class MallardDuck extends Duck { /** *头是绿色的 */ @Override void display() { System.out.println("外观是绿头的鸭子"); } }   RedheadDuck子类 public class RedheadDuck extends Duck { /** * 外观是红头 */ @Override void display() { System.out.println("外观是红头的鸭子"); } }   2、现在呢,有一个需求

设计模式系列(一)——策略模式

醉酒当歌 提交于 2019-11-27 19:11:16
概念: 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。(维基百科) 理解概念: 概念中说策略模式是某个行为在不同场景下有不同的实现算法。我们知道有一条设计原则是这样的:分离变化的部分和不变的部分。在这个概念中我们可以知道。不变的地方,是这个行为,变化的,是执行这个行为所需要的算法,或者说是策略。 应用场景: 这个模式的应用场景应该是这样的。我们需要对若干个都可以实现我们所要的功能中选择一个最合适的。举一个简单的例子:java君、Pascal君、Scala君三个人要去餐厅吃饭。可是呢,他们仨个人的口味不一样,java君想吃面向对象大餐,Pascal君想吃面向过程大餐,而Scala君想吃函数式大餐,这时候假设你是餐厅服务员,你给每个人点餐的时候,就要这样写了 if(pascal君) return 面向过程大餐;else if(java君)return 面向对象大餐;else if(scala君)return 函数式大餐; 这就太糟了。因为如果又来了一个spring先生想要吃aop大餐,就要去更改源码了。这不符合我们“对修改关闭,对扩展开放”的原则。所以这种设计是不行的。 解决之道: 我们说要分离开变化的和不变的东西。变化的就是对不同的人要上不同的菜。我们把这一点从代码中分离出来。单独封装起来。利用多态,给每一类人一个点某种菜的能力