关于设计模式,之前也有接触,不过一直没有彻底理解,这些天抽空重新梳理了一遍,今天刚好空闲,就做个总结。先说说策略模式,关于策略模式,书中是这样定义的:策略模式(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("我要讨好洪教主,好让他给我豹胎易经丸的解药!"); } }
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(); } }
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("**************施展完毕****************"); } }