首页 > 代码库 > Java设计模式----策略模式

Java设计模式----策略模式

策略模式(Strategy Pattern)体现了两个非常基本的面向对象设计的原则

      1、封装变化的概念;

      2、编程中使用接口,而不是对接口的实现。

  策略模式定义了一个共同的抽象算法接口,其子类实现这个接口定义的方法,并且都有各自不同的实现,这些算法实现可以在客户端调用它们的时候互不影响的变化。   子算法之间是弱连接的关系,提高了软件的可扩展性与可重用性。

 策略模式组成

   1、抽象策略角色:策略类,通常由一个接口或者抽象类实现

   2、具体策略角色:包括了相关的算法和行为,可能不止一个具体策略角色

   3、环境角色:持有一个策略类的引用,最终给客户端调用的。

策略模式编写步骤

  1、对一组算法抽象出一个共同接口,定义这个共同接口

  2、编写策略类,实现这个借口,每个策略类都有其独特的实现

  3、编写环境角色类,类中持有一个对共同接口的引用,对策略对象注入如set方法和get方法或者用构造方法完成赋值


下面是一个策略模式事例

        刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
        先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜,用 JAVA 程序怎么表现这个呢?我们先看类图:


三个妙计是同一类型的东东,那咱就写个接口:

package com.sanguo.strategy;

/**
 * 定义策略接口
 * 诸葛亮妙计接口
 * */
public interface IStrategy {
	//每个锦囊妙计都是一个可执行的算法
	public void operate();
}

然后再写三个实现类,有三个妙计嘛:

package com.sanguo.strategy;

/**
 * 走后门算法
 * */
public class BackDoor implements IStrategy {

	@Override
	public void operate() {
		System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
	}

}

package com.sanguo.strategy;

/**
 * 求吴国太开绿灯算法
 * */
public class GivenGreenLight implements IStrategy {

	@Override
	public void operate() {
		System.out.println("求吴国太开绿灯,放行!");
	}

}

package com.sanguo.strategy;

/**
 * 孙夫人断后挡追兵
 * */
public class BlockEnemy implements IStrategy {

	@Override
	public void operate() {
		System.out.println("孙夫人断后,挡住追兵");
	}

}

好了,大家看看,三个妙计是有了,那需要有个地方放这些妙计呀,放锦囊呀:

package com.sanguo.strategy;

/**
 * 环境角色,主要完成对特定策略的调用 这里代表诸葛亮装计策的锦囊
 * */
public class Context {
	private IStrategy strategy;

	public Context(IStrategy strategy) {
		this.strategy = strategy;// 构造函数,你要使用的计策算法
	}

	//使用计谋,看我出招
	public void operate() {
		this.strategy.operate();
	}
}

然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:

package com.sanguo.strategy;

public class ZhaoYun {
	public static void main(String[] args) {
		Context context;
		// 刚刚到吴国的时候拆第一个
		context = new Context(new BackDoor()); // 拿到妙计
		context.operate(); // 拆开执行
		// 刘备乐不思蜀了,拆第二个了
		context = new Context(new GivenGreenLight());
		context.operate(); // 执行了第二个锦囊了
		// 孙权的小兵追了,咋办?拆第三个
		context = new Context(new BlockEnemy());
		context.operate(); // 孙夫人退兵
	}
}

执行结果,