`

设计模式学习笔记——策略模式

阅读更多

 

策略模式

属于对象的行为模式,是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得他们之间可互相替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。

 

策略模式是对算法的包装,把使用算法的责任和算法本身分离,委派给不同对象管理。

 

策略模式涉及到的角色

环境角色Context:持有Strategy类的引用

抽象策略角色Strategy:抽象角色,由接口或抽象类实现,给出统一算法接口

具体策略角色ConcreteStrategy:具体的算法实现

 

搬运过来的类图一枚


从代码上来看策略模式相当简单,甚至可以免去解释,下面是各个类的实现

首先是抽象接口Strategy

 

public interface Strategy {
	public void strategyInterface();
}
 

接下来是具体策略类,这里实现2个,只是打印一句话

 

public class ConcreteStrategy implements Strategy{
	@Override
	public void strategyInterface() {
		System.out.println("first strategy");
	}
}

public class ConcreteStrategy2 implements Strategy{
	@Override
	public void strategyInterface() {
		System.out.println("second strategy");
	}
}
 

再者是环境角色,持有一个策略类的引用

 

public class Context {
	private Strategy strategy;
	
	public Context(Strategy strategy){
		this.strategy=strategy;
	}
	
	public void contextInterface(){
		strategy.strategyInterface();
	}
}
 

最后来看策略模式达到的效果

 

public class StrategyPattern {
	public static void main(String[] args) {
		Context context1=new Context(new ConcreteStrategy());
		Context context2=new Context(new ConcreteStrategy2());
		
		context1.contextInterface();
		context2.contextInterface();
	}
}
 

输出结果

 

first strategy

second strategy

 

上面的策略模式应该说是最最简单的,在书中还提到了策略模式在实现过程中需要注意的地方

1 具体策略角色有公共的行为或者属性 这个情况还是比较多的 此时应该将上面的Strategy从接口改为抽象类

2 策略模式在同一时间只能使用一个策略对象,但一个应用程序可能需要与多个策略相关联。也就是说,应用程序启动的时候,策略对象应该已经被创立,从而实现切换。

 

策略模式的使用时机

1 系统中有许多类,而他们之间的区别只是行为

2 系统需要动态选择几种算法,则将算法包装起来

3 系统算法使用的数据不能让客户端知道

4 一个对象有多种行为,只能使用多重if...else语句实现

 

策略模式的优缺点

优点

1 提供了管理相关算法族的方法。适当使用继承可以把公共代码转移到父类,避免重复代码

2 策略模式提供了替换继承关系的办法。

3 避免了多重条件判断

缺点

1 客户端必须知道所有的策略类,并自行决定使用哪个。

2 造成会有很多策略类(可由享元模式减少对象数量)

 

以上是策略模式的简单描述 很多也是书上的摘录 在网上同样有不少策略模式的文章 下面是具体的2篇

http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html

http://www.uml.org.cn/sjms/201009092.asp

两者都有一个非常循序渐进的讲解过程,给了具体的场景,并提供了如何提供优化,为何使用策略模式的讲解,是非常好的,非常推荐

前一篇的鸭子问题,是将鸭子的fly行为抽象成接口,并分别给不同的鸭子提供了具体的fly方法实现,并由鸭子去选择使用哪一种方式。

后一篇则是典型的策略模式场景,折扣问题。同样的,将折扣类的不同方式作为具体策略的实现,而由客户来决定应该使用哪一种折扣方式。

而从上面不同鸭子(不同客户)的角度看,也体现了策略模式的一个缺点,就是客户端必须知道可用的策略类。

 

除了以上2个写得非常深入浅出的例子,在Java中也有该例子,是什么呢,书上给的是java.awt中的例子,LayoutManager的例子,但是对于对awt没有什么接触的人,在理解上可能会比较困难,其实在Java或者C#中,有一个经常用到的东西,也是应用了策略模式,他就是排序问题

正好前两天和韩神讨论了这个问题,java对于值类型的List实现了sort方法,这是大家都知道的,但是对于List<T>的泛型中,我们经常会放置非值类型的元素,更多的时候,是对象集合,那么此时sort方法便不可用了。

观察仔细的话,会发现Collections中有一个静态方法sort(Collections<T> cols, Comparator comp),这个方法也是我们需要关注的了

Comparator是一个接口,而这个接口恰恰是对应了策略模式中的抽象策略类Strategy,那么对应策略模式去看,排序问题就非常好理解了,我们需要实现自己的排序算法,就应当是去实现一个自己的MyComparator(对应具体策略ConcreteStrategy)。而这里Collections呢,自然是扮演了Context的角色。

 

这里再提一句额外的,关于Comparator和Comparable之间的区别,上面已经说了Comparator是代表一个具体的策略算法。而Comparable是指能力,可以理解为,实现了Comparable的对象,是可以被比较的,即赋予类比较的能力(实现其中的Compare方法),而实现Comparator,则只是一个具体的比较算法。


  • 大小: 21.3 KB
0
2
分享到:
评论

相关推荐

    web学习笔记 —— DAO设计模式

    DAO(Data Access Object)设计模式是一种软件设计模式,主要用于数据库操作的封装,它将业务逻辑与数据访问逻辑分离开来,使得系统更加模块化,提高了代码的可复用性和可测试性。在Web开发中,DAO模式是常用的数据...

    学习笔记——资料

    【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...

    Java学习笔记——良葛格

    【Java学习笔记——良葛格】是一份由爱好者良葛格整理的Java学习资料,主要以PDF格式呈现,虽然可能不完整,但包含了丰富的Java编程基础知识和实践技巧,旨在为初学者提供一个学习和参考的平台。以下是笔记中可能...

    Android Training学习笔记——Navigation 参考源码(ListView版)

    这篇“Android Training学习笔记——Navigation 参考源码(ListView版)”深入探讨了如何使用Navigation构建一个基于ListView的导航系统。我们将从以下几个方面来详细讨论这个主题: 1. **Navigation组件简介** ...

    视频学习笔记——李宏毅机器学习——P1,2

    理解这些要素对于设计和优化机器学习系统至关重要。 总结来说,机器学习是一个涵盖广泛领域的研究主题,包括深度学习、监督学习、无监督学习和强化学习等多种方法。这些方法都在不断进步,推动着人工智能的发展,并...

    C++笔记——iNotes

    C++是一种强大的、通用的...这些只是C++编程中的一小部分知识点,"C++笔记——iNotes"可能会涵盖更多细节,如内存管理、异常处理、模板元编程、设计模式等。通过深入学习并结合实践,你可以成为一名熟练的C++开发者。

    HeadFirst设计模式笔记

    在本笔记中,我们将探讨设计模式的核心概念,并通过具体的例子——`PizzaIngredientFactory`来实践这些模式。 首先,设计模式分为三大类:创建型、结构型和行为型模式。创建型模式关注对象的创建,如单例模式...

    IPv6协议学习笔记5——数据中心IPv4-IPv6双栈架构.pdf

    在双栈架构下,数据中心的服务器和交换机需要具备处理两种协议的能力,这涉及到网络设备的配置、路由策略以及地址管理等方面。 PXE(Preboot Execution Environment)装机在IPv6环境中的应用是一个重要的讨论点。...

    希赛——软件设计师考试笔记

    软件设计师考试是计算机技术与软件专业技术资格(水平)考试的...这份考试笔记覆盖了软件设计师考试的主要知识点,考生可以通过学习这些内容来系统地准备考试,并对计算机科学与软件工程领域的核心概念有深入的理解。

    软件设计师软考笔记.zip

    这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...

    sd卡中文学习笔记

    **SD卡中文学习笔记——深度解析** SD卡,即Secure Digital Memory Card,是一种基于闪存技术的便携式存储介质,广泛应用于各种电子设备中,如数码相机、智能手机、平板电脑等,尤其在硬件开发领域,对于新手而言,...

    学习笔记 MHT2

    【学习笔记 MHT2】是一份综合性的IT学习资料,主要涵盖了JavaScript编程、软件开发工具、Web服务器技术、编码解码方法以及设计模式等多个领域的知识。以下是对这些知识点的详细阐述: 1. **JavaScript经典技巧**:...

    良葛格Java JDK 5.0 学习笔记 - 文字编辑器制作

    综上所述,《良葛格Java JDK 5.0 学习笔记——文字编辑器制作》不仅提供了关于Java编程的具体指导,还深入探讨了软件工程的最佳实践,如需求分析、设计模式、界面设计原则以及持续集成和重构等高级主题。这对于初学...

    Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计(csdn)————程序.pdf

    对于没有真实生产环境的学习者,可以通过阅读文档、模拟实践和参与社区讨论来提升技能。同时,其他技术如 JVM、Netty、Tomcat、Mysql、Spring、Mybatis、Nginx、Zookeeper 和 RabbitMQ 等也是面试中常见的考察点。

    基于深度学习的整本书阅读教学策略——以《红楼梦》阅读教学为例.pdf

    通过对学生的阅读进度、笔记内容、讨论活跃度等数据的分析,教师可以更精准地了解学生的学习状态,调整教学策略,提供个性化的反馈和支持。 最后,**参考文献和专业指导**在深度学习中起到辅助作用。教师应广泛参考...

    strategy study note

    《策略模式的学习笔记》 策略模式是面向对象设计中的一种行为设计模式,它使你能在运行时改变对象的行为。在本学习笔记中,我们将深入探讨如何利用策略模式解决实际问题,以及如何通过UML(统一建模语言)来记录和...

    学习笔记 testOracle

    【标题】"学习笔记 testOracle" 提供了一个线索,表明这是一份关于Oracle数据库的学习资料。Oracle是全球广泛使用的大型关系型数据库管理系统,用于存储、管理和处理大量的结构化数据。在学习笔记中,作者可能详细...

    PPT爱好交流群(猫群)学习笔记总结分享ppt模板.rar

    "PPT爱好交流群(猫群)学习笔记总结分享ppt模板.rar"是一个压缩包文件,其内容可能包含了由PPT爱好者在特定的交流群体——“猫群”中分享的学习心得和PPT模板资源。这个文件名暗示了这是一个集学习、交流与资源共享...

    struts2学习笔记黑马程序员

    ### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...

Global site tag (gtag.js) - Google Analytics