Java设计模式研究之策略模式

note:从今天开始每天研究一个设计模式《big bug , oh no!》

(一)策略模式(Strategy)

1.什么是策略模式:    

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。(copy)

2.策略模式的设计原则:

        设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。  
      策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。(copy)

(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

3.策略模式的优点:

          策略模式的好处在于你可以动态的改变对象的行为。

4.策略模式经典例子:

策略模式经典的例子就是诸葛亮给赵云三个锦囊的案例,下面是代码:

(1)定义策略接口

package com.ly.moshitest.strategy;
/**
 * 
 * @author ly
 *定义策略接口,其实你会发现和状态模式是一样样,区别咱后边看吧
 */
public interface Istrategy {
	//定义接口操作
	public void operate();
}
(2)实现3个妙计

a.老刘想娶别个妹子,咱的弄点舆论,骗骗乔老爷子

package com.ly.moshitest.strategy;


public class MakeYuLun implements Istrategy {


	@Override
	public void operate() {
		// TODO Auto-generated method stub
		System.out.println("到吴地后派人到处宣扬孙权妹妹与刘备即将结婚的消息" +
				"(特别要告诉乔国老,他是周瑜的岳父,通过他告诉孙权的妈妈)");
	}




}

b.制造个假消息,骗刘备早点回家,害怕他娶了媳妇,忘了蜀啊

package com.ly.moshitest.strategy;


public class MakeMessage implements Istrategy {


	@Override
	public void operate() {
		// TODO Auto-generated method stub
		System.out.println("制造假消息“刘备曹操要来打荆州”,催刘备回去");
	}


}

c.孙夫人断后,挡住追兵
package com.ly.moshitest.strategy;


public class FindHelp implements Istrategy {


	@Override
	public void operate() {
		// TODO Auto-generated method stub
		System.out.println("找孙夫人求救,挡住追兵!");
	}


}
(3)三个妙计都有了,那我们得找锦囊来放这三个妙计了吧

package com.ly.moshitest.strategy;

/**
 * 
 * @author ly
 *我们都是诸葛亮,我们都得会制造锦囊啊
 */
public class Context {

	private Istrategy istrategy;
	public Context(Istrategy istrategy){
		this.istrategy = istrategy;
	}
	public void operate(){
		this.istrategy.operate();
	}
}

(4)咱们把妙计和锦囊都装备好了,就给赵云去执行吧

package com.ly.moshitest.strategy;

public class ZhaoYun {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//来三个锦囊
		Context context1 = new Context(new MakeMessage());
		Context context2 = new Context(new MakeYuLun());
		Context context3 = new Context(new FindHelp());
		System.out.println("老刘想娶人家妹子,怎么办啊?");
		//不急,咱不是有军师锦囊嘛,打开第一个
		context1.operate();
		System.out.println("\n\n");
		
		System.out.println("周郎和孙权设计要留住刘备,怎么办呢?");
		//不急,军师锦囊,打开第二个
		context2.operate();	
		System.out.println("\n\n");
		System.out.println("孙权反悔了,派兵追拿刘备!,怎么办啊!!!");
		//快,军师锦囊,打开第三个
		context3.operate();
		System.out.println("\n\n");
		}

}
就这样,刘备就娶到了漂亮嫩媳妇。策略模式的特点主要体现在,策略类,我们可以继续根据不同的需求,继续增加,我们在使用的时候,只需要使用Context这个中间件就行了,这样软件开发中的要求,高内聚低耦合,完全体现出来了。(其实个人理解所谓的高内聚低耦合,就降低多个类与类之间的联系,代码量比较大的时候,这真的是个麻烦的事,我们就可以采用使用 中间齿轮的方式,连接类与类之间,这样 问题就简单多了嘛)。

4.策略模式和状态模式的区别:其实这个挺简单的,状态类嘛,咱们的设置个状态呗,然后去做判断呗,策略模式完全不会设置状态的嘛

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值