Java设计模式之策略模式

本文通过策略模式解释了鸣人在不同情境下使用不同忍术的机制,包括色诱术、多重影分身术和螺旋丸,强调了模式在避免代码冗余和提高代码复用性方面的优势。

一、引入

上一篇简单工厂模式,理应能多次调用同一方法,这就与秽土转生好像矛盾了,毕竟一个人只有一个灵魂,无法持续对一个人多次转生,既然这样的话,那笔就是设计模式之单例模式吗?有点道理,下次整理整理写吧

上一篇写到秽土转生,其实还有个缺点,就是违反了高内聚低耦合的原则,要拓展秽土转生术的范围,必须对工厂类进行改变,即对大蛇丸类里的秽土转生方法进行改变,这明显是一个不好的方法。因此就想到了策略模式,那么换个例子来写策略模式,就写鸣人,鸣人遇到不同的人就使用不同的忍术,遇到三代老头色诱术,遇到水木要杀伊鲁卡多重影分身,遇到药师兜来个螺旋丸,不同的情况使用不同的术,我想应该是这个策略模式,那么来先看下结构图理解下

二、模式结构


解释下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-------------------------------------------------------


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值