`
zhb8015
  • 浏览: 398292 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Spring Roo杂谈
浏览量:0
社区版块
存档分类
最新评论

策略模式的学习

 
阅读更多


strategy pattern:
1 when: purpose
2 what: principle
3 how : examples
4 in all;
5 tutorial refer to url


STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

1 when: purpose
(1) 如果在一个系统里含有许多的类,它们之间的区别仅在于它们的行为,应该使用策略模式动态的选择其中的一种.
(2) 如果在一个系统里含有几种算法,需要动态的去选择其中的一种时,应该选择策略模式.
(3) 如果一个系统算法的复杂性和涉及的数据不想让客户端知道,应该选择策略模式.
(4) 如果一个对象有多种形为,应该使用策略模式来避免使用难以维护的多重条件语句来实现.
2 what: principle
(1) 策略模式就是把行为和环境(Context)分割开来,环境负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中,由于算法和环境独立开来,算法的修改就不会影响到客户端.
(2) 策略模式的结构

这个模式涉及到三个角色:
A 环境角色(Context):持有一个Strategy类的引用.
B 抽象策略角色(Strategy):给出了所有具体角色类所需的接口,通常由一个接口或抽象类实现.
C 具体策略角色(ConcreteStrategy):包装了相关的算法和行为.

代码清单:
************************************************
Context:
package com.strategy;
public class Context {
private Strategy strategy;

/**
* strategy method
*/
public void contextInterface() {
strategy.strategyInterface();
}
}

Strategy:
package com.strategy;

public abstract class Strategy {

/**
* strategy method
*/
public abstract void strategyInterface();
}

ConcreteStrategy:
package com.strategy;

import java.io.Serializable;

public class ConcreteStrategy extends Strategy {

@Override
public void strategyInterface() {

}
}

************************************************
3 how: examples
实例一:
策略类(Strategy): Strategy.java(抽象类或接口)
具体策略类(ConcreteStrategy) : Add,Substract,Multiply,Divide
环境类(Context): Context上下文

代码清单**************************************************************
Strategy:::

package com.javapattern.strategy.calculate01;

public abstract class Strategy {
public abstract void operation(float a,float b);
}

Add::::
package com.javapattern.strategy.calculate;

public class Add extends Calculate {
public void operation(float a,float b) {
float add = a + b;
System.out.println("the result of a add b is " + add);
}
}

Substract::::
package com.javapattern.strategy.calculate;

public class Substract extends Calculate {
public void operation(float a,float b) {
float substract = a - b;
System.out.println("the result of a substract b is " + substract);
}
}

Multiply::::
package com.javapattern.strategy.calculate;

public class Multiply extends Calculate {
public void operation(float a,float b) {
float multiply = a * b;
System.out.println("the result of a * b is " + multiply);
}
}

Context::::
package com.javapattern.strategy.calculate01;

public class Context {
private Strategy strategy;

final static Strategy add = new Add();
final static Strategy substract = new Substract();
final static Strategy multiply = new Multiply();
final static Strategy divide = new Divide();

public void operation(float a,float b) {
strategy.operation(a, b);
}
}

测试类::::
package com.javapattern.strategy.calculate01;

public class Test {
public static void main(String[] args) {
float a = 100;
float b = 100;

Context.add.operation(a,b);
Context.substract.operation(a, b);
Context.multiply.operation(a, b);
Context.divide.operation(a, b);
}
}

实例二:
图书折扣的算法:

图书销售中的折扣计算问题,假设有三种折扣三种算法:
算法一: 没有折扣,返回0为折扣值.
算法二: 一元的折扣.
算法三: 百分比折扣,比如一本书的价格为20,折扣百分比为7%,则折扣价为20*7%=1.4

角色分配:
策略类(Strategy): DiscountStrategy.java
具体策略类(ConcreteStrategy) : 算法一二三 NoDiscountStrategy.java,FlatRateStrategy.java,PrecentageStrategy.java
环境类(Context): DiscountContext.java

结构图:

代码清单:****************************************
context::::::::

package com.javapattern.strategy.booksales01;

public class ContextStrategy {
private DiscountStrategy strategy = null;

public ContextStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}

public double calculateStrategy() {
return this.strategy.calculateStrategy();
}
}

strategy::::::

package com.javapattern.strategy.booksales01;

/**
* strategy class
* @author Administrator
*
*/
public abstract class DiscountStrategy {
public double price = 0;
public int copies = 0;

public DiscountStrategy(double price,int copies) {
this.price = price;
this.copies = copies;
}

public abstract double calculateStrategy();
}

ConcreteStrategy::::::

package com.javapattern.strategy.booksales01;

/**
* concreteStrategy class
* @author Administrator
*
*/
public class NoDiscountStrategy extends DiscountStrategy {

public NoDiscountStrategy(double price,int copies) {
super(price,copies);
}

public double calculateStrategy() {
return 0;
}
}

package com.javapattern.strategy.booksales01;

/**
* concreteStrategy
* @author Administrator
*
*/
public class FlatDiscountStrategy extends DiscountStrategy {
private double amount = 10;

public FlatDiscountStrategy(double price,int copies) {
super(price,copies);
}

public double calculateStrategy() {
return copies * amount;
}

public void setAmount(double amount) {
this.amount = amount;
}

public double getAmount() {
return amount;
}
}

package com.javapattern.strategy.booksales01;

/**
* concreteStrategys class
* @author Administrator
*
*/
public class PrecentageDiscountStrategy extends DiscountStrategy {
private double precentage = 0.2;

public PrecentageDiscountStrategy(double price,int copies) {
super(price,copies);
}

public double calculateStrategy() {
return price * copies * precentage;
}

public void setPrecentage(double precentage) {
this.precentage = precentage;
}

public double getPrecentage() {
return precentage;
}
}

测试类::::

package com.javapattern.strategy.booksales01;

public class Test {
public static void main(String[] args) {
double price = 100;
int copies = 2000;
double discountAmt = 0;

// DiscountStrategy noDiscountStrategy = new NoDiscountStrategy(price,copies);
// DiscountStrategy flatDiscountStrategy = new FlatDiscountStrategy(price, copies);
DiscountStrategy flatDiscountStrategy = new PrecentageDiscountStrategy(price, copies);

ContextStrategy ctx = new ContextStrategy(flatDiscountStrategy);
discountAmt = ctx.calculateStrategy();
System.out.println("discount amount is " + discountAmt);
}
}

*************************************************


**********************************************************************

5 tutorial refer to url

<<java and pattern>>
晨曦视频
GOF

分享到:
评论

相关推荐

    策略模式学习代码

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...

    设计模式之策略模式 鸭子问题

    策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这样,算法独立于使用它的客户而...

    设计模式C++学习之策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法类都实现了一个公共接口,使得它们可以被相同的客户端代码调用,而...

    Spring下使用策略模式

    在学习Spring策略模式的过程中,了解Bean的生命周期、依赖注入以及AOP的概念是至关重要的。同时,阅读和理解Spring的源码能帮助我们更好地掌握其工作原理,从而在实际项目中更灵活地运用策略模式。 最后,`pom.xml`...

    抽象工厂模式+工厂方法模式+策略模式+类图实现手机加工厂

    本文将探讨三个重要的设计模式:抽象工厂模式、工厂方法模式以及策略模式,并结合一个实际的场景——手机加工厂,来具体阐述它们的应用。 首先,我们来看**抽象工厂模式**。这个模式主要用于创建相关或依赖对象的...

    php设计模式-策略模式-例题学习

    在这个"php设计模式-策略模式-例题学习"的例子中,我们将深入理解策略模式的运用及其在PHP中的实现。 首先,让我们来看看核心的类和接口: 1. `HandStrategyInterface.php`: 这个文件定义了一个接口`...

    策略模式代码实现

    总的来说,通过分析这个“策略模式代码实现”,我们可以学习如何在实际项目中利用策略模式来组织代码,提高代码的可维护性和可扩展性。通过阅读和理解提供的源码,我们可以更深入地理解策略模式的工作原理及其在实际...

    Java 设计模式 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一...在Java开发中,尤其是在需要灵活处理算法选择的场景下,策略模式是一个值得学习和使用的工具。

    工厂模式和策略模式

    在软件设计模式的世界里,"工厂模式"和"策略模式"是两种常用的设计模式,它们在构建可扩展和可维护的代码中起着至关重要的作用。让我们深入探讨这两种模式及其在实际开发中的应用。 首先,工厂模式是一种创建型设计...

    策略模式demo例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,有时我们需要根据不同的场景或条件...通过学习和理解`StrategyMarket`中的示例,你可以更深入地了解如何在实际项目中有效地运用策略模式。

    设计模式之策略模式(附demo)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,我们经常遇到需要根据不同...通过分析和学习"policy"压缩包中的示例代码,我们可以深化对策略模式的理解,并将其应用于实际的开发工作中。

    设计模式之策略模式,商场收银,封装算法

    这些文件可以帮助读者更好地理解和学习策略模式的实践应用。 总结起来,策略模式和封装算法在商场收银场景中的结合,提供了灵活的折扣策略管理方式,使得系统能够根据业务需求快速适应变化,同时也降低了代码的复杂...

    策略模式工厂方法模式观察者模式

    本资源主要涵盖了三种经典的设计模式:策略模式、工厂方法模式以及观察者模式,对于初学者来说是非常有价值的学习资料。 **策略模式**是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的...

    HeadFirst策略模式

    在《HeadFirst策略模式》中,作者通过生动有趣的例子和直观的视觉呈现,帮助读者深入理解这一模式,并提供了C++实现的示例代码,便于实践和学习。阅读本书,你可以更好地掌握如何在实际项目中运用策略模式,提高代码...

    设计模式之策略模式源码

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景执行不同策略的情况。策略模式就是为了解决这类问题而诞生的,它将算法封装到具有共同接口的独立...

    java设计模式之策略模式与模板模式

    本篇文章将深入探讨两种重要的设计模式:策略模式和模板模式。通过理解这两种模式,开发者可以更好地组织代码,提高代码的灵活性和可扩展性。 ### 策略模式 策略模式是一种行为设计模式,它使你能在运行时改变对象...

    简单工厂模式、代理模式、策略模式如此相似

    在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...

    记事本 使用了策略模式和命令模式

    通过分析和学习这些代码,我们可以更深入地理解策略模式和命令模式在实际项目中的应用,同时也能提升自己的编程技巧和设计思维。 总的来说,策略模式和命令模式在记事本软件中的应用展示了设计模式在提高代码质量、...

    java策略模式示例.zip

    总的来说,这个"java策略模式示例"是一个很好的学习资源,通过实践可以深入理解策略模式的精髓,提高软件设计能力。在学习过程中,建议动手编写代码,模仿示例,甚至尝试创建自己的策略,以巩固理论知识并提升编程...

Global site tag (gtag.js) - Google Analytics