`
java苹果+番茄
  • 浏览: 67974 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

策略(Strategy)模式 【行为模式第三篇】

阅读更多
策略(Strategy)模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,
策略模式可以在不影响到客户端的情况下发生变化。

一、策略模式涉及到的角色;
1、环境(Context)角色:持有一个Strategy类的引用。
2、抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需要的接口。
3、具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

//环境角色
		public class Context{
			private Strategy strategy;
			
			//策略方法
			public void contextInterface(){
				strategy.strategyInterface();
			}
		}
		
		//抽象策略类
		public abstract class Strategy{
			//策略方法
			public abstract void strategyInterface();
		} 
		
		//具体策略类
		public class ConcreteStrategy extends Strategy{
			public void strategyInterface(){
				//............
			}
		}
		
	二、一个图书折扣店的例子
		//抽象折扣类
		public abstract class DiscountStrategy{
			private single price = 0;
			private int copies = 0;
			
			//策略方法
			public abstract single calculateDiscount();
			
			public DiscountStrategy(single price , int copies){
				this.price = price;
				this.copies = copies;
			}
		}
		
		//具体折扣类(没有折扣)
		public class NoDiscountStrategy extends DiscountStrategy{
			private single price = 0;
			private int copies = 0;
			
			public  NoDiscountStrtegy(single price, int copies){
				this.price = price;
				this.copies = copies;
			}
			
			public single calculateDiscount(){
				return 0;
			}
		}
		
		//
		public class FlatRateStrategy extends DiscountStrategy{
			private single price = 0;
			private int copies = 0;
			private single amount;
			
			public FlatRateStrategy(single price , int copies){
				this.price = price;
				this.copies = copies;
			}
			
			public single getAmount(){
				return amount;
			}
			
			public void setAmount(single amount){
				this.amount = amount;
			}
			
			public single calculateDiscount(){
				return copies*amount;
			}
		}
		
		//
		public class PercentageStrategy extends DiscountStrategy{
			private single percent;
			private single price = 0;
			private int copies = 0;
			
			public PercentageStrategy(single price , int copies){
				this.price = price;
				this.copies = copies;
			}
			
			public single getPercent(){
				return percent;
			}
			
			public void setPercent(single percent){
				this.percent = percent;
			}
			
			public single calculateDiscount(){
				return copies*price*percent;
			}
		}


三、使用策略模式的情况
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为
   中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是
   一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体
   算法类,并只持有一个数据类型是抽象算法类的对象。
3、一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户大涉及到不必要接触到的复杂的和只与算法有关的数据。
4、如果一个对象有很多行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些
   行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。

四、策略模式的优点,缺点
1、优点:
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把
     公共的代码移到父类里面,从而避免重复的代码。
(2)策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法
     或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使
     用者就和算法或行为本身混在一起。决定使用哪一种算法或采用哪一种行为的逻辑就和算法或行为的逻辑混合在
     一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
(3)使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为
     的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
2、缺点:
(1)客户端必须知道所有的策略类。并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便
     适时选择恰当的算法类。换言之,策略模式只使用于客户端知道所有的算法或行为的情况。
(2)策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,
     这样策略类实例可以被不同客户端使用。换言之,可以使用亨元模式来减少对象的数量。
分享到:
评论

相关推荐

    详解SpringBoot结合策略模式实战套路

    策略模式是一种行为设计模式,它允许开发者定义一些策略族,分别封装起来,每一个策略中的算法具有一定的独立性,分别在不同的上下文中完成不同的任务。策略模式通常由三个部分组成:策略接口、策略实现类、环境上...

    桥接模式和策略模式的区别,内含可运行代码和两者详细区别

    而策略模式(Strategy Pattern)则是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用它的客户端。它主要用于处理那些具有多种行为的对象,可以根据具体情境选择不同...

    策略模式的实现,通过反射

    策略模式包含三个主要角色:策略接口(Context)、具体策略类(Concrete Strategies)以及上下文(Strategy)。策略接口定义了所有支持的算法的公共接口,具体策略类实现了这个接口,提供了具体的算法实现。上下文则...

    策略模式的简单例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同条件或选择执行不同算法的情况。策略模式提供了一种将算法封装到独立可互换的策略对象中,使得算法的变化独立...

    HeadFirst策略模式

    《HeadFirst策略模式》是设计模式领域的一本经典著作,其第一章主要介绍了策略模式的基本概念、原理以及在C++中的具体实现。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许我们用不同的...

    第3讲_strategy模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在上述的"打印机销售折扣计算"问题中,策略模式能很好地解决需求变化带来的挑战。通过策略模式,我们可以将每种折扣计算方法封装为一个独立的类,这些...

    Head first 设计模式 第一章 策略模式 pdf + 源代码

    第一章重点介绍了策略模式,这是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,让算法独立于使用它的客户。 策略模式的...

    java设计模式之Strategy (2).pdf

    Java设计模式中的Strategy模式是一种对象行为型模式,它允许在运行时动态地改变对象的行为。在上述例子中,Strategy模式被用来处理字符串替换的不同策略。这个模式的核心是定义一系列算法,并将每个算法封装到一个...

    java设计模式之策略模式

    策略模式是Java设计模式中的一种行为模式,它允许在运行时选择算法或策略,而无需在编译时就做出决定。这种模式的核心思想是将不同的算法封装到具有共同接口的独立类中,使得它们可以相互替换,从而提高了代码的灵活...

    第九讲:策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,我们经常遇到需要根据不同的条件或时间来改变算法的情况,策略模式就是为了解决这类问题而诞生的。 策略模式的核心思想是定义一系列...

    java设计模式--策略模式

    策略模式是Java设计模式中的一种行为模式,它允许在运行时选择算法或策略,从而提供了更大的灵活性。在HeadFirst的《设计模式》一书中,第一章深入浅出地讲解了这一模式,通过实例帮助读者理解其核心概念和应用场景...

    《设计模式18》-策略模式.ppt

    策略模式是一种设计模式,它使我们能够封装一系列相关的算法或者行为,并将它们作为相互独立的类来使用。这种模式允许在运行时动态选择并切换不同的算法或行为,而无需更改客户端代码。策略模式的核心思想是将算法的...

    设计模式之蝉

    除了创建型模式,内容中还提到了“策略模式”(Strategy pattern),属于行为型设计模式。它定义了算法族,分别封装起来,使它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。在内容中提到的“我可以...

    Java设计模式之禅

    1. 策略模式(Strategy Pattern):允许在运行时选择算法的行为,如书中提到的“锦囊妙计”例子,通过不同的策略应对不同的情形。 2. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问,常...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4.... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    Delphi模式编程第一分卷

    9.3.1 用适配器模式包装第三方API的范例 9.3.2 范例小结 第10章 桥接模式(Bridge) 10.1 模式解说 10.2 结构和用法 10.2.1 模式结构 10.2.2 代码模板 10.3 范例与实践 10.3.1 使用桥接模式改进数据持久层的...

    Delphi模式编程第二分卷

    9.3.1 用适配器模式包装第三方API的范例 9.3.2 范例小结 第10章 桥接模式(Bridge) 10.1 模式解说 10.2 结构和用法 10.2.1 模式结构 10.2.2 代码模板 10.3 范例与实践 10.3.1 使用桥接模式改进数据...

    C#设计模式PDF 电子书

    七、策略模式(Strategy) 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法的变化独立于使用算法的客户。C#中的策略模式通常通过接口或抽象类来实现,允许在运行时选择不同的算法...

    设计模式可复用面向对象软件的基础.zip

    第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 ...

Global site tag (gtag.js) - Google Analytics