一、引入
上一篇简单工厂模式,理应能多次调用同一方法,这就与秽土转生好像矛盾了,毕竟一个人只有一个灵魂,无法持续对一个人多次转生,既然这样的话,那笔就是设计模式之单例模式吗?有点道理,下次整理整理写吧
上一篇写到秽土转生,其实还有个缺点,就是违反了高内聚低耦合的原则,要拓展秽土转生术的范围,必须对工厂类进行改变,即对大蛇丸类里的秽土转生方法进行改变,这明显是一个不好的方法。因此就想到了策略模式,那么换个例子来写策略模式,就写鸣人,鸣人遇到不同的人就使用不同的忍术,遇到三代老头色诱术,遇到水木要杀伊鲁卡多重影分身,遇到药师兜来个螺旋丸,不同的情况使用不同的术,我想应该是这个策略模式,那么来先看下结构图理解下
二、模式结构
解释下UML图,这里同样是有三个角色分别是:
1、抽象策略类,描述鸣人遇到各种情况应对的策略,即使用的忍术 。 对应Strategy(抽象策略类)
2、SeYouShu,LuoXuanWan,DuoChongYingFenShen类,描述鸣人会的各种忍术并用这些忍术处理突发情况 。对应ConcreteStrategy(具体策略类)
3、MinRen类,描述鸣人遇到各种场景释放不同忍术。对应Context(应用场景)
三、源代码-模式实现
package strategyPattern;
/**
* @author hanhexin
*
*/
public interface IStrategy {
//定义个接口,描述鸣人会的忍术
public void renshu();
}
package strategyPattern;
/**
* @author hanhexin
*色诱术
*/
public class SeYouShu implements IStrategy {
/* (non-Javadoc)
* @see strategyPattern.Strategy#renshu()
*/
public void renshu() {
// TODO Auto-generated method stub
System.out.println("鸣人遇到三代老头,使用色诱术成功逃脱");
}
}
package strategyPattern;
/**
* @author hanhexin
*多重影分身术
*/
public class DuoChongYingFenShen implements IStrategy {
/* (non-Javadoc)
* @see strategyPattern.IStrategy#renshu()
*/
public void renshu() {
// TODO Auto-generated method stub
System.out.println("鸣人保护伊鲁卡,使出多重影分身术");
}
}
package strategyPattern;
/**
* @author hanhexin
*螺旋丸
*/
public class LuoXuanWan implements IStrategy{
/* (non-Javadoc)
* @see strategyPattern.Strategy#renshu()
*/
public void renshu() {
// TODO Auto-generated method stub
System.out.println("鸣人学会螺旋丸,击败药师兜");
}
}
package strategyPattern;
/**
* @author hanhexin
*
*/
public class MingRen {
private IStrategy strategy;
public MingRen(IStrategy strategy) {
this.strategy = strategy;
}
//肯据具体的策略对象,调用其忍术的方法
public void renshuInterface() {
strategy.renshu();
}
}
package strategyPattern;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MingRen mRen;
//前几集小时候的鸣人在历代火影头像上被三代老头逮住了
//鸣人使用色诱术成功逃脱
mRen = new MingRen(new SeYouShu());
mRen.renshuInterface();
//鸣人为救伊鲁卡,使用多重影分身教训水树(注水树就是唆使鸣
//人去偷的多重影分身那个人)
mRen = new MingRen(new DuoChongYingFenShen());
mRen.renshuInterface();
//传说中三忍那集中,鸣人遇到药师兜用螺旋丸将其击败
mRen = new MingRen(new LuoXuanWan());
mRen.renshuInterface();
}
}
四、模式简介
来源:http://baike.baidu.com/view/2141079.htm
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
组成:
—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
—具体策略角色:包装了相关的算法和行为。
—环境角色:持有一个策略类的引用,最终给客户端\调用。
Context(应用场景):
1、需要使用ConcreteStrategy提供的算法。
2、 内部维护一个Strategy的实例。
3、 负责动态设置运行时Strategy具体的实现算法。
4、负责跟Strategy之间的交互和数据传递。
Strategy(抽象策略类):
1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(具体策略类):
2、 实现了Strategy定义的接口,提供具体的算法实现。
五、模式优缺点
优点:
1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
解决方案:工厂方法
六、使用场景
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
----------欢迎转载 原文链接:http://blog.youkuaiyun.com/hhxin635612026/article/details/9016345-------------------------------------------------------