【设计模式七之策略模式】你有你的张良计,我有我的过墙梯

【设计模式七之策略模式】你有你的张良计,我有我的过墙梯Strategy模式细说策略模式策略模式究竟是什么模式策略模式的场景官宣的策略模式代码展示细说策略模式提示:博主:章飞_906285288的博客博客地址:http://blog.csdn.net/qq_29924041

细说策略模式

提示:
博主:章飞 _906285288的博客
博客地址:【设计模式七之策略模式】你有你的张良计,我有我的过墙梯

策略模式究竟是什么模式

“策略”又叫谋略,计策,有一下几种定义,1. 可以实现目标的方案集合;2. 根据形势发展而制定的行动方针和斗争方法;3. 有斗争艺术,能注意方式方法。
从定义里面也可以看出来,第一种就是通过不同的方法达到相同的目的,第二种就是根据不同的形势,然后制定不同的方法计策。第三种说实话,有点抽象,我也解释不清楚,哈哈,总而言之,策略这种东西就是根据某种形势,用不同的方法,达成一个或者不同的目的
策略模式在实际的编程过程中的应用是极其广泛的,使用策略模式,对程序代码,面向对象等都会有很深的理解

策略模式的场景

场景一:
记得很久以前在设计模式之禅里面看过作者举的例子,是三国时期,刘备去江东找老婆,诸葛亮给赵云的三个妙计,放在锦囊里面,俗称叫做锦囊妙计,根据不同的情况取出精囊中的妙计。这里面赵云—精囊—-妙计刚好组成了一种策略形式

场景二:
我现在要去某一个北京一趟,现在交通那么方便了,我可以坐飞机飞过去,可以坐高铁一路坐过去,也可以坐大巴去,还有就是走路其实也不失为一种方法,那我要根据情况来定吧,如果我时间不急,我选便宜点的大巴,如果我赶着去开会,那我可能会选择飞机,视情况而定吧,反正有很多种选择。我—去北京的方式—-具体到每一种方式也组成了一种策略的选择

场景三:
我在代码中使用的策略,之前遇到一个需求,android内部某个应用会给我发送一条固定的消息,但是当我的程序收到这个消息的时候,我需要判断此时我的账户是否登录了,当前网络是否连接上了,根据两两组合下来,会有四种情况,所以使用策略模式,当我收到这个消息的时候,判断当前的情况,然后根据不同的情况来做出不同的显示,这个在实际的应用过程中是很常见使用的。

官宣的策略模式

上图

来自百度百科

从上面的中可以看到,首先策略模式中大概分成这几种角色,
1:策略的上下文Context,其实也就是类似策略场景一种的精囊,场景二种所有交通方案汇总的集合
2:Strategy策略的抽象类或者接口,一般是接口,所有的具体的妙计都叫妙计
3:ConcreteStategyA,ConcreteStategyB,ConcreteStategyC具体的策略形式
其实整体思路比较简单,策略模式是开闭原则(OCP–open close protocal)的典型应用,也相对来说比较简单吧
如下图所示的:
在这里插入图片描述
整个策略模式里面其实就是这样的几个模块,首先外部调用StategyContext中的方法,此时,由StrategyContext调用IStrategy的具体的方法,调用关系比较简单,不赘述。

代码展示

代码一

抽象接口,IStrategy

package com.zzf.designpattern.strategypattern.demo1;
//这是诸葛亮给云哥的妙计的接口
public interface IStrategy {
	public void operate();
}

//策略一

package com.zzf.designpattern.strategypattern.demo1;

public class BackDoorStrategy implements IStrategy {
	public void operate() {
		// TODO Auto-generated method stub
		System.out.println("找乔老板帮忙,给孙董事长试压");
	}
}

//策略二

package com.zzf.designpattern.strategypattern.demo1;

public class GivenGreenLight implements IStrategy {

	public void operate() {
		// TODO Auto-generated method stub
		System.out.println("求吴国太开个绿灯,放行!");
	}

}

//策略三

package com.zzf.designpattern.strategypattern.demo1;

public class BlockEnemyStrategy implements IStrategy{

	public void operate() {
		// TODO Auto-generated method stub
		System.out.println("孙夫人断后,挡住追兵");
	}
}

锦囊

package com.zzf.designpattern.strategypattern.demo1;

public class StrategyContext {
	
	private IStrategy mIStrategy;
	
	
	public StrategyContext(IStrategy mIStrategy){
		this.mIStrategy = mIStrategy;
	}

	public void operate() {
		// TODO Auto-generated method stub
		if (mIStrategy != null) {
			mIStrategy.operate();
		}
	}
	
}

调用方

package com.zzf.designpattern.strategypattern.demo1;

/**
 * 
 * @author Administrator
 * 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。
 * 策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。
 * 用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”
 * 主要是符合OCP原则(open close protocal)
 */
public class StrategyPatternTest {
	
	public static void main(String[] args) {
		
		StrategyContext mStrategyContext;
		mStrategyContext = new StrategyContext(new BackDoorStrategy());
		mStrategyContext.operate();
		
		mStrategyContext = new StrategyContext(new GivenGreenLight());
		mStrategyContext.operate();
		
		mStrategyContext = new StrategyContext(new BlockEnemyStrategy());
		mStrategyContext.operate();
		
	}
	
}

可以看到根据不同的情况,然后会调用不同的方法。
策略模式总体来说,是一种非常简单的方法,但是最主要的思想其实就是如何抽取公共对象,并且对其进行管理和调度的过程。程序代码中往往此类的场景很多,结合设计模式的话,能让代码显得更加优雅。本文也借鉴的是设计模式之禅中的案例。
感谢其作者给予的帮助


在最后谢谢 大家的观看,写的不好的,或者错误的,请各位看官不腻赐教,不懂的地方,也可以相互交流,这也是在记录自己的成长过程的一种方式,谢谢,欢迎持续访问博客:会有更多精彩的

欢迎继续访问,我的博客今天的文章【设计模式七之策略模式】你有你的张良计,我有我的过墙梯分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/61683.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注