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