策略模式:
定义一系列的算法,并将算法封装,使得各算法之间可以相互替换,策略算法彼此的变化并不影响,彼此之间相互独立。
策略环境:持有一个策略类的引用,最终提供一个接口给客户端。
策略角色:封装算法或行为。
抽象策略角色:策略类,通常有一个接口或抽象类实现。
优点:使用策略模式避免了多重条件选择语句,避免硬编码
提供管理算法族的方法,使代码可重用。
提供了使用同一个行为的不同实现,同一个行为可以根据不同的情况选择不同的策略。
缺点:客户端必须知道所有的策略才能选择。
会产生多个策略类。
例子:
import com.alibaba.fastjson.JSONObject;
/**
* 支付策略,支付的接口
* @author javadev
*
*/
public interface PayInterface {
public JSONObject payAction();
}
/**
* 微信支付算法类,实现支付接口,重写支付动作
* @author javadev
*
*/
public class WeChatAlgorithm implements PayInterface {
@Override
public JSONObject payAction() {
JSONObject json = new JSONObject();
System.out.println("use wechat to pay my order");
json.put("msg", "wechat pay success");
return json;
}
}
/**
* 支付宝支付算法,实现支付接口,重写支付方法
* @author javadev
*
*/
public class zhiFuBaoAlgorithm implements PayInterface {
@Override
public JSONObject payAction() {
// TODO Auto-generated method stub
JSONObject json = new JSONObject();
System.out.println("use zhifubao to pay my order");
json.put("msg", "zhifubao pay success");
return json;
}
}
import com.alibaba.fastjson.JSONObject;
/**
* 持有一个支付策略的引用。为客户端提供支付接口toPay()
* @author javadev
*
*/
public class ContextTest {
private PayInterface inteface;
public ContextTest(PayInterface inteface){
this.inteface = inteface;
}
public JSONObject ToPay(){
JSONObject json = new JSONObject();
json = inteface.payAction();
return json;
}
}
import com.alibaba.fastjson.JSONObject;
/**
* @author javadev
*/
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//实例化一个算法
PayInterface inteface = new WeChatAlgorithm();
//将算法利用ContextTest的构造函数注入ContextTest类的test对象
ContextTest test = new ContextTest(inteface);
//通过ContextTest类的test对象调用toPay()方法,完成支付
JSONObject json = test.ToPay();
System.out.println(json.toJSONString());
}
}
输出结果:
use wechat to pay my order
{"msg":"wechat pay success"}
策略模式与工厂模式的区别:
50块钱买衣服,策略模式的做法就是去京东、当当、淘宝、卓越等网上去看(京东、当当、淘宝、卓越相当于4中策略),然后决定要买那一件。而工厂模式的做法是,告诉系统我需要用50块钱买件衣服,到底他去当当、淘宝、京东、卓越你不关心,你只需要50块钱的一件衣服。工厂相当于黑盒子,策略相当于白盒子。
用途不一样
工厂是创建型模式,它的作用就是创建对象;
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
关注点不一样
一个关注对象创建
一个关注行为的封装
解决不同的问题
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。
工厂相当于黑盒子,策略相当于白盒子;