设计模式学习笔记(六)之策略模式(Strategy)
(一):策略模式的定义:
它定义了算法家族,分别封装起来,让他们之间可以相互替换,这个模式让算法的变化,不会影响到使用的用户。
(二):策略模式体现了两个 最基本的面向对象的原则:
(三):策略模式的意义:
使用策略模式我们可以开发出很多可以替换的组件,这样可以软件可以具备更高的可扩展性,重用性大大提高
(四):策略模式中的各种角色:
- 抽象策略角色:策略类,通常由一个接口或者抽象类实现;
- 具体策略角色:封装了相关的算法和行为;
- 环境角色:持有一个策略类的引用,然后我们客户端可以去调用;
(五):看下策略模式的结构图:
使用策略模式,我们这对一组算法,可以去把每一个算法封装到具有共同接口的独立的类中,这样我们可以进行相互退换了。这样算法可以再不影响客户端调用的情况下去发生改变,这样可以把行为和环境进行分开来。算法的具体实现是在具体策略类中。
(六):下面我们来自己模拟实现一个策略模式(首先看下例子的结构图)
①:抽象策略角色:Strategy.java
package com.jiangqq.strategy;
//抽象策略角色:接口
//定义了所有具体的策略角色的公共算法接口
public interface Strategy {
public int calculate(int a,int b);
}
②:具体策略角色:AddStrategy.java,ReduceStrategy.java,MultiplyStrategy.java,DivideStrategy.java
package com.jiangqq.strategy;
//具体策略类:加法策略的实现类
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a+b;
}
}
package com.jiangqq.strategy;
//具体策略类:减法策略的实现类
public class ReduceStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}
package com.jiangqq.strategy;
//具体策略类:乘法策略的实现类
public class MultiplyStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a*b;
}
}
package com.jiangqq.strategy;
//具体策略类:除法策略的实现类
public class DivideStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
// TODO Auto-generated method stub
return a/b;
}
}
③:环境角色:Context.java
package com.jiangqq.strategy;
//环境角色,持有策略类的引用,去调用该具体策略类的算法
//给客户端去进行调用
public class Context {
//定义策略角色的引用,通过Context的构造函数传进去
private Strategy mStrategy;
public Context(Strategy pStrategy) {
this.mStrategy = pStrategy;
}
//具体策略角色去实现算法
public int calculate(int a,int b)
{
return mStrategy.calculate(a, b);
}
}
④:Client测试类:
package com.jiangqq.strategy;
//客户端测试实例代码
public class Client {
public static void main(String[] args) {
//使用加法的策略
Context context=new Context(new AddStrategy());
System.out.println(context.calculate(1, 2));
//使用减法的策略
context=new Context(new ReduceStrategy());
System.out.println(context.calculate(1, 2));
//使用乘法的策略
context=new Context(new MultiplyStrategy());
System.out.println(context.calculate(1, 2));
//使用除法的策略
context=new Context(new DivideStrategy());
System.out.println(context.calculate(1, 2));
}
}
测试结果:
(七):这样的策略模式的缺点:
我们必须要知道所有的策略类,并且要我们自己去决定要去使用哪个策略类,而且这样会存在大量的策略类
为了尽可能的消除这些缺点,我们可以使用策略模式加简单工厂模式的方法来进行实现
(点击进入:工厂模式)
这时我们需要去改变一下
①:环境角色类:Context.java
package com.jiangqq.factory;
//在进行创建ContextFactory对象的时候,传入type值进行,根据不同的值,
//工厂类会进行创建出对象的策略类
//1:加法策略类 2:减法策略类 3:乘法策略类 4:除法策略
import com.jiangqq.strategy.AddStrategy;
import com.jiangqq.strategy.DivideStrategy;
import com.jiangqq.strategy.MultiplyStrategy;
import com.jiangqq.strategy.ReduceStrategy;
import com.jiangqq.strategy.Strategy;
//这是生成不同具体策略类的工程类
public class ContextFactory {
Strategy mStrategy=null;
public ContextFactory(int type)
{
switch (type) {
case 1:
//1:加法策略类
mStrategy=new AddStrategy();
break;
case 2:
// 2:减法策略类
mStrategy=new ReduceStrategy();
break;
case 3:
// 3:乘法策略类
mStrategy=new MultiplyStrategy();
break;
case 4:
//4:除法策略
mStrategy=new DivideStrategy();
break;
}
}
public int calculate(int a,int b)
{
return mStrategy.calculate(a, b);
}
}
②:客户端测试类:
package com.jiangqq.factory;
//在进行创建ContextFactory对象的时候,传入type值进行,根据不同的值,
//工厂类会进行创建出对象的策略类
//1:加法策略类 2:减法策略类 3:乘法策略类 4:除法策略
public class Client {
public static void main(String[] args) {
//进行加法的策略
ContextFactory contextFactory=new ContextFactory(1);
System.out.println(contextFactory.calculate(1, 2));
//进行减法的策略
contextFactory=new ContextFactory(2);
System.out.println(contextFactory.calculate(1, 2));
//进行乘法的策略
contextFactory=new ContextFactory(3);
System.out.println(contextFactory.calculate(1, 2));
//进行除法的策略
contextFactory=new ContextFactory(4);
System.out.println(contextFactory.calculate(1, 2));
}
}
//在进行创建ContextFactory对象的时候,传入type值进行,根据不同的值,
//工厂类会进行创建出对象的策略类
//1:加法策略类 2:减法策略类 3:乘法策略类 4:除法策略,此时根据不同的策略类去调用的算法,实现不同的行为.
使用策略模式,我们简化测试,因为每个算法都是在定义具体的类中,可以进行单独的测试。策略模式是用来封装算法并且可以封装任何类型的行为,所有在使用中如果要在不同的时间要去应用不同的规则,那我们可以去使用策略模式实现.
代码下载链接地址:http://download.csdn.net/detail/jiangqq781931404/4202470
分享到:
相关推荐
设计模式学习笔记,分析了GOF的23种模式和类设计的原则
Java设计模式学习笔记
我收集的设计模式的学习笔记,采用pdf格式,便于收藏和查看
各个模式都有详细的例子C#学习笔记,打开就知道了
HeadFirst设计模式学习笔记比较全面详细地讲解了13个设计模式,有利于大家更好的学习HeadFirst设计模式,希望亲们会喜欢~~~
总结了java开发中的21种设计模式,详解和例子,带书签的pdf格式,方便阅读!
设计模式学习笔记.ppt 自己写的一点学习笔记。
javascript设计模式之策略模式学习笔记.docx
设计模式学习笔记,总共23个设计模式,还有几个设计原则
Head First 设计模式学习笔记。更多内容请参见文章内容。
23种设计模式学习笔记及源码,全部原创 欢迎提出意见和建议
学习Java设计模式的笔记,标注了其中重要的要点,如果有需要的小伙伴,自行下载哦
http://blog.csdn.net/laszloyu/archive/2010/05/11/5579765.aspx 示例代码
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
代理模式学习笔记、单例模式学习笔记、命令模式、原型模式、模式特点总结。 为个人对设计模式的理解,如果有理解不一致的不要砸砖啊
设计模式之美—学习笔记,纯手打,学习极客时间课程得到。 如有意见或建议,欢迎联系,一起学习讨论。
学习设计模式入门的好材料 简单明了,一看就懂 帮助你快速学习或是复习23种设计模式
设计模式学习笔记-命令模式
java设计模式的学习笔记,其中包含各种模式的代码实现
Head.First 设计模式学习笔记.pdf Head.First 设计模式学习笔记.pdf