Java设计模式之策略模式

简介:
策略模式:
    策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
    策略模式它主要是定义了一个算法家族,该算法家族内的具体策略类可以自由在交换。它并不是利用继承来实现算法的,而是将多个不同种类的行为组合在接口或抽象类中,在子类中让客户来选择哪一个算法的实现。它主要就是采用委托模型,利用对象组合来在运行的过程中将具体的行为委托至具体的策略类中。
    该算法族其实就是许多个类实现了相同的接口,称为策略类,并且各自有不同的实现,策略模式完全屏蔽了超类与子类对于具体行为(或算法)的实现,在子类中,只需要调用设置所要不同的行为的策略类,通过继承超类,超类来利用多态动态的改变所要具体调用的行为或算法。 
    策略模式一般使用的情况,当一个类有多个子类来需要继承它,而类中某一个行为或者方法在日后的运行中可能会经常发生变化,为了不增加整体的软件的维护复杂度,一般将该行为或者方法单独用一个接口定义,子类根据不同的需要而定义自己的实现这个类的策略类,在超类中只需要定义一个行为的接口,利用多态和组合来处理具体的行为与策略。
样例:
    一个游戏中有多个角色,而每个角色都有使用武器的行为,但是每次只能使用一把武器,角色可以进行更换武器。
分析:
    抽出经常要变化的,就是武器的具体名,而共同的行为都为使用武器,则可以定义一个接口武器,其余每个都实现该武器,定义自己的所需的武器。对于角色名,定义一个总的抽象类,里面有使用武器的方法,再定义一个武器接口的属性,更换武器的方法,每个角色实现该抽象类角色,或者在构造器初始化角色初始的武器,或者在继承的更换武器方法中定义。
   实现:类图如下:
 
 Character类
 
  1. public class Character {  
  2.  WeaponBehavior weapon;  
  3.  public void fight()  
  4.  {  
  5.   weapon.useWeapon();  
  6.  }  
  7.  public void setWeapon(WeaponBehavior weap)  
  8.  {  
  9.   this.weapon=weap;  
  10.  }  

WeaponBehavior:策略类的父类,所有要更换武器都实现这个
 
  1. public interface WeaponBehavior {  
  2.  void useWeapon();  
  3. }  
  4.   
SwordBehavior :一个策略类,只针对一个武器做的具体策略或算法
 
  1. public class SwordBehavior implements WeaponBehavior{  
  2.  public void useWeapon() {  
  3.   // TODO Auto-generated method stub  
  4.   //使用剑的操作  
  5.  }  
  6. }  

King:某一个角色具体子类,在构造器中根据需要来进行更换武器的策略类
 
  1. public class King extends Character {  
  2.  public King(SwordBehavior sword)  
  3.  {  
  4.   this.weapon=sword;  
  5.  }  
  6. }  
 
策略模式的优点:动态改变算法或行为,而不影响整体软件系统,体现了多态与组合的特性
策略模式的缺点:客户必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解,不过可以让客户自行定制一些新的策略类
在编程中要掌握一些基本的设计原则:
设计原则:
1)找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
2)针对接口编程,而不是针对具体编程,真正的意思则就是“针对超类型编程”
3)多用组合,少用继承
 
 
 
 本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1122822
 

相关文章
|
28天前
|
设计模式 算法 Java
Java中的设计模式:提升代码质量的秘诀
【8月更文挑战第23天】在Java开发中,设计模式是提高代码可读性、可维护性和扩展性的强有力工具。本文通过浅显易懂的语言和实际案例,探讨几种常见的设计模式及其在Java中的应用,旨在帮助开发者更好地理解并运用这些模式来优化自己的代码结构。
39 2
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
2天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
6天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
1天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深度解析
在PHP开发中,策略模式是一种行为设计模式,它允许你在运行时根据不同情况选择不同的算法或行为。本文将深入探讨策略模式的定义、结构、使用场景以及在PHP中的实现方法,并通过实例展示如何在PHP项目中应用策略模式来提高代码的灵活性和可维护性。
|
2天前
|
设计模式 人工智能 算法
PHP中的设计模式:策略模式的深入解析与实践软件测试中的人工智能革命:提升效率与准确性的新篇章
在PHP开发中,理解并运用设计模式是提升代码质量和可维护性的重要途径。本文聚焦于策略模式(Strategy Pattern),一种行为型设计模式,它允许在运行时选择算法或业务规则。通过本文,我们将深入探讨策略模式的定义、结构、使用场景以及如何在PHP项目中有效地实现和利用策略模式。不同于性能优化等技术性摘要,本文着重于提供对策略模式全面而实用的理解,助力开发者编写出更加灵活和可扩展的应用程序。 本文深入探讨了人工智能在软件测试领域的应用,揭示了其如何显著提高测试过程的效率和准确性。通过实际案例分析,展示了AI技术在自动化测试、缺陷检测及结果分析中的关键作用,并讨论了实施AI测试策略时面临的挑
12 3
|
6天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深度解析
在本文中,我们将深入探讨PHP编程中的策略模式,这是一种行为型设计模式,用于定义一系列算法,将每个算法封装起来,并使它们可以互换。通过详细讲解策略模式的概念、结构以及在PHP中的实现方式,我们希望能够帮助读者更好地理解和应用这一设计模式,提升代码的灵活性和可维护性。
16 1
|
21天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
37 2
|
21天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
30 1