设计模式-5.策略模式

来源:互联网 发布:pythonr 网络爬虫 编辑:程序博客网 时间:2024/06/04 23:27

1.什么是策略模式:

定义一组算法,将每个算法都封装起来,并且他们之间可以互换。

策略模式使这些算法在客户端调用他们的时候能够互不影响地变化


策略模式体现两个非常基本的面向对象设计的原则:

1.封装变化的概念

2.编程中使用接口,而不是对接口的实现

**************************************************************************************

策略模式的组成

抽象策略角色:策略类,通常是一个接口或者抽象类实现

具体策略角色:包装了相关的算法和行为

环境角色:持有一个策略类的引用,最终给客户端调用

策略模式的实现步骤

1.对策略对象定义一个公共接口。

2.编写策略类,该类实现公共接口。

3.在使用策略对象的类中保存一个对策略对象的引用。

4.在使用策略对象的类中,实现对策略对象的set和get方法或使用构造方法完成赋值。

缺点:

1.客户端必须知道所有的策略类,并决定使用哪个策略类

2.造成很多策略类

解决方法:使用工厂方法

****************************************************************************************


抽象角色:

public interface Strategy{public int calculate(int a, int b);}

两个具体抽象角色:

//定义加法功能public class AddStrategy implements Strategy{public int calculate(int a, int b){return a + b;}}

//定义除法角色public class DivStrategy implements Strategy{@Overridepublic int calculate(int a, int b){// TODO Auto-generated method stubreturn a / b;}}

环境角色:

public class Environment{private Strategy strategy;public Environment(Strategy strategy){this.strategy = strategy;}public void setStrategy(Strategy strategy){this.strategy = strategy;}public Strategy getStrategy(Strategy strategy){return this.strategy;}public int calculate(int a, int b){return strategy.calculate(a, b);}}
测试类:

public class Client{public static void main(String[] args){                //设置加法策略               AddStrategy addStrategy = new AddStrategy();//通过加法构造环境角色Environment environment = new Environment(addStrategy);//System.out.println(environment.calculate(3, 4));DivStrategy divStrategy = new DivStrategy();Environment environment2 = new Environment(divStrategy);System.out.println(environment2.calculate(3, 1));                                //environment通过调用setStrategy,改变策略                environment.setStrategy(divStrategy);          System.out.println(environment.calculate(2, 2));      }}
这里单纯看System.out.println(environment.calculate(2,3))无法判断执行什么策略,完全依靠传入的策略模式。



0 0
原创粉丝点击