策略模式认知


策略模式:

        定义一系列的算法,并将算法封装,使得各算法之间可以相互替换,策略算法彼此的变化并不影响,彼此之间相互独立。

        策略环境:持有一个策略类的引用,最终提供一个接口给客户端。

        策略角色:封装算法或行为。

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


优点:使用策略模式避免了多重条件选择语句,避免硬编码

            提供管理算法族的方法,使代码可重用。

            提供了使用同一个行为的不同实现,同一个行为可以根据不同的情况选择不同的策略。

缺点:客户端必须知道所有的策略才能选择。

            会产生多个策略类。

   

例子:

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块钱的一件衣服。工厂相当于黑盒子,策略相当于白盒子。

用途不一样 
工厂是创建型模式,它的作用就是创建对象; 
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
关注点不一样 
一个关注对象创建 
一个关注行为的封装


解决不同的问题 
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。 
策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。


工厂相当于黑盒子,策略相当于白盒子;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值