大话设计模式——策略模式篇

关于设计模式,之前也有接触,不过一直没有彻底理解,这些天抽空重新梳理了一遍,今天刚好空闲,就做个总结。先说说策略模式,关于策略模式,书中是这样定义的:策略模式(Strategy Pattern):定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。相信很多人看完和我一样一头雾水,下面我们依次击破。


其实说白了就一句话,策略模式的核心思想就是把算法提取出来放到一个独立的对象中。也就是面向对象总的针对接口编程,而不是针对实现。最近在看鹿鼎记,拿韦小宝来说事,韦小宝这人油嘴滑舌,甚会拍马屁,一个人兼任皇上身边的红人,还是天地华的香主,神龙教的白龙使。


下面我们来看看这个场景,三种身份,一大脑用来见风使舵,一个执行者韦小宝。韦小宝根据不同场合选择不同的应对策略。三种身份其实都是换汤不换药,因为都需要韦小宝的油腔滑调,须臾拍马,所以可以认为是同一个东东,抽象出来一个接口。

package com.lyc.strategy.impl;
/**
 * 定义一个策略接口,这是韦小宝针对不同场合使用策略的接口
 * @author liyangchao
 *
 */
public interface IStrategy {
	public void DoSomething();
}
然后在写三个实现类,针对三个不同身份说不同的话,摆不同的架子。

package com.lyc.strategy;

/**
 * 皇上身边的策略
 */
import com.lyc.strategy.impl.IStrategy;
public class HuangShang implements IStrategy {

	public void DoSomething() {
		// TODO Auto-generated method stub
		System.out.println("奴才小桂子叩见皇上,皇上万福金安!");
	}

}
package com.lyc.strategy;
/**
 * 青木堂香主时的策略
 */
import com.lyc.strategy.impl.IStrategy;

public class XiangZhu implements IStrategy {

	public void DoSomething() {
		// TODO Auto-generated method stub
		System.out.println("我现在是韦香主,我要反清复明!");
	}

}
package com.lyc.strategy;

/**
 * 神龙教白龙使的策略
 * @author liyangchao
 */
import com.lyc.strategy.impl.IStrategy;

public class BaiLongShi implements IStrategy {

	public void DoSomething() {
		// TODO Auto-generated method stub
		System.out.println("我要讨好洪教主,好让他给我豹胎易经丸的解药!");
	}

}

Ok,现在三种策略都已具备,得有一个地方存放起来,就是韦小宝的大脑里,哈哈。这样他就可以对什么样的人吹什么样的牛。

package com.lyc.strategy;

import com.lyc.strategy.impl.IStrategy;

public class UsingStrategy {

	//构造函数,对什么样的人吹什么样的牛
	private IStrategy iStrategy;

	public UsingStrategy(IStrategy iStrategy) {
		super();
		this.iStrategy = iStrategy;
	}
	
	//开始吹牛了
	public void DoStrategy(){
		this.iStrategy.DoSomething();
	}
}

好了,这下韦小宝就可以在皇上,天地会和神龙教之间游刃有余了,因为他可以对不同的场合来施展对应的策略,所到之处,无不呼风唤雨,不亦乐乎。在Java代码里我们只需要显示地指明需要使用哪一个策略对象就可以了。

package com.lyc.strategy;

public class WeiXiaoBao {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		UsingStrategy usingStrategy;

		// 回宫见皇上
		System.out.println("==========回宫见皇上,使用皇上技能============");
		usingStrategy = new UsingStrategy(new HuangShang());
		// 施展技能
		usingStrategy.DoStrategy();
		System.out.println("**************施展完毕****************");

		// 回天地会当香主
		System.out.println("==========回天地会,使用香主技能============");
		usingStrategy = new UsingStrategy(new XiangZhu());
		// 施展技能
		usingStrategy.DoStrategy();
		System.out.println("**************施展完毕****************");

		// 回神龙教做白龙使
		System.out.println("==========回神龙教做白龙使,使用白龙使技能============");
		usingStrategy = new UsingStrategy(new BaiLongShi());
		// 施展技能
		usingStrategy.DoStrategy();
		System.out.println("**************施展完毕****************");

	}
}


好,现在策略模式已经全部实现,高内聚低耦合的特点也淋漓尽致的表现出来了,还有一个就是扩展性,也就是OCP原则,策略类可以继续增加下去,代码的可读性和扩展性都有了很大的提高,即使以后还需要添加新的策略,你也是手到擒来了!

你可能感兴趣的:(设计模式,设计模式,面向对象,ocp,策略模式)