首页 > 学院 > 开发设计 > 正文

设计模式(1)---策略模式

2019-11-06 06:36:25
字体:
来源:转载
供稿:网友

一、定义

策略模式:定义了算法族(将一组行为想象成一族算法),分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

二、策略模式的结构

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的额对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。也就是说,准备一组算法并将每一个算法封装起来,使得它们可以互相互换。看下面的结构框图:

image

我们由框图得到三个角色: (1)环境角色(context):持有一个Strategy的引用; (2)抽象策略模式(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 (3)具体策略角色(ConcreteStrategy):包装了相关的算法或行为。

三、代码实例

package Model;/** * Created by L_kanglin on 2017/3/6. */public class Context { //注意这是个接口 PRivate Strategy strategy; /* *构造一个函数,传入一个具体策略对象 * @param strategy */ public Context(Strategy strategy) { this.strategy = strategy; } /* * 策略方法 * */ public void congtextInterface(){ strategy.strategyInterfece(); }}public interface Strategy { //策略方法,抽象方法,等着后面去实现 public void strategyInterfece();}public class ConcreteStrategyA implements Strategy { @Override public void strategyInterfece() { //进行相关的业务 }}public class ConcreteStrategyB implements Strategy { @Override public void strategyInterfece() { //进行相关的业务 }}public class ConcreteStrategyC implements Strategy { @Override public void strategyInterfece() { //进行相关的业务 }}/** * Created by L_kanglin on 2017/3/6. */public class Client { public static void main(String[] args){ //选择并创建需要使用到的策略对象,一种多态的展示 Strategy strategy = new ConcreteStrategyA(); Context context = new Context(strategy); //执行业务 context.congtextInterface(); //然后执行各自的子方法 }}

从上面的实例中,策略模式仅仅是封装算法,提供新的算法插入到已有的系统中,以及以前的算法从系统中淘汰的方法,策略模式并不决定何时使用某种算法,在什么情况下使用算法是由客户端决定的。

四、分析

(1)策略模式保证了各个策略算法的平等性,对于一系列的具体实现,大家的地位是平等的,实现各个具体算法实现之间的相互切换,而它们彼此之间是没有依赖的可以理解为是相同行为的不同实现; (2)运行期间,策略模式在同一个时刻只能使用一个具体的策略实现; (3)所有的具体策略类都有一些公有的行为。此时就应该把这些公有的行为放到共同的抽象策略角色Strategy中。

文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表