Strategy----策略模式
来源:互联网 发布:卡通艺术字软件下载 编辑:程序博客网 时间:2024/06/16 02:11
1、策略模式(Strategy Pattern)体现了两个基本的现象对象设计的原则:(1)封装变化的概念(2)编程中使用接口,而不是对接口的实现
2、策略模式的组成:
(1)抽象策略角色:策略类,一般由一个接口或者抽象类实现
(2)具体策略角色:包装了相关的算法和行为
(3)环境角色:持有一个策略类的引用,最终给客户端调用
3、策略模式的实现
(1)策略模式这对一组算法,将每一个算法封装到具有公共接口的独立的类中,从而使得它们可以相互替换
(2)策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来
(3)环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境是相互独立的,算法的修改不会影响环境和客户端
4.策略模式的编写步骤
(1)对策略对象定义一个公共接口
public interface Strategy {
public int calculate(int a, int b);
}//完成基本的算术运算
(2)编写策略类,该类实现了(1)中的公共接口
AddStrategy//完成加法的类
SubStrategy//减法
MultiplyStrategy//乘法
DivideStrategy//除法
(3)在引用策略对象的类中保存一个对策略对象的引用
public class Environment {
private Strategy strategy;
}
(4)在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值。
参考Collections类的源代码
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy)
{
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
5、调用strategy对象
public class Environment {
private Strategy strategy;
public Environment(Strategy strategy)
{
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a, int b)//调用
{
return strategy.calculate(a, b);
}
}
6、客户端测试:
public class Client {public static void main(String[] args) {
AddStrategy add = new AddStrategy();
Environment environment = new Environment(add);
System.out.println(environment.calculate(3,4));
SubStrategy sub = new SubStrategy();
environment.setStrategy(sub);
System.out.println(environment.calculate(3, 4));
MultiplyStrategy multiply = new MultiplyStrategy();
environment.setStrategy(multiply);
System.out.println(environment.calculate(3, 4));
DivideStrategy divide = new DivideStrategy();
environment.setStrategy(divide);
System.out.println(environment.calculate(3, 4));
}
}
从上面的代码可以看出来,我们在调用时只需设置具体的策略即可。从外观上看不出来我们具体调用了什么样的方法。(完成基本加减乘除没必要这么麻烦,此时只是用简单的数学运算来演示策略模式的使用)
策略模式的缺点:1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。 2、造成很多的策略类
解决方法:采用工厂方法(另外一种设计模式)
- 策略模式 Strategy模式
- Strategy模式 策略模式
- 策略模式(Strategy模式)
- 策略模式(Strategy Pattern)
- Strategy策略模式
- 策略(Strategy)模式
- Strategy策略模式
- 策略(Strategy)模式
- 策略模式(Strategy Pattern)
- 策略模式 Strategy Pattern
- 策略模式(Strategy Pattern)
- 策略模式(Strategy)
- HeadFirst Strategy策略模式
- 策略模式(Strategy Pattern)
- Strategy Pattern (策略模式)
- 泛化策略模式(Strategy)
- Strategy 策略模式
- Strategy 策略模式
- 常见插值方法
- C++学习 boost学习之-shared_ptr
- ListView的点击事件方法参数解释
- Android广播接收器Broadcast Receiver-android学习之旅(十二)
- android网络编程所涉及到的知识
- Strategy----策略模式
- WOai wojiao
- 鸡啄米vc++2010系列38(文档、视图和框架:概述)
- wireshark抓包dhcp
- Displaying Bitmaps Efficiently
- request中url
- 两种高效的事件处理模式
- 倒序输出你输入的正整数
- C++学习 boost学习之-scoped_array