策略模式的学习

本文详细介绍了策略模式的概念及其应用场景,通过示例展示了如何将算法封装在独立的类中以便于替换和扩展,同时提供了两个具体的代码实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值