0%

设计模式-策略模式


完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
为了解决这些问题,可以定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法,在这里,每一个封装算法的类我们都可以称之为策略(Strategy),为了保证这些策略的一致性,一般会用一个抽象的策略类来做算法的定义,而具体每种算法则对应于一个具体策略类。

基础

Strategy

1
2
3
4
5
6
7
public interface Strategy {

/**
* 策略方法
*/
public void strategyInterface();
}

ConcreteStrategyA

1
2
3
4
5
6
7
public class ConcreteStrategyA implements Strategy {

@Override
public void strategyInterface() {
System.out.println("ConcreteStrategyA");
}
}

ConcreteStrategyB

1
2
3
4
5
6
7
public class ConcreteStrategyB implements Strategy {

@Override
public void strategyInterface() {
System.out.println("ConcreteStrategyB");
}
}

ConcreteStrategyC

1
2
3
4
5
6
7
public class ConcreteStrategyC implements Strategy {

@Override
public void strategyInterface() {
System.out.println("ConcreteStrategyC");
}
}

Context

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Context {

//持有一个具体策略的对象
private Strategy strategy;

/**
* 构造函数,传入一个具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}

/**
* 策略方法
*/
public void contextInterface(){
strategy.strategyInterface();
}

}

Test.java

1
2
3
4
5
6
7
public class Test {

public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.contextInterface();
}
}

应用

MemberStrategy.java

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 会员策略
*/
public interface MemberStrategy {

/**
* 计算图书的价格,根绝会员等级
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
public double calcPrice(double booksPrice);

}

PrimaryMemberStrategy.java 初级会员

1
2
3
4
5
6
7
public class PrimaryMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("初级会员,没有折扣");
return 0;
}
}

IntermediateMemberStrategy.java 中级会员

1
2
3
4
5
6
7
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("对于中级会员的折扣为10%");
return booksPrice * 0.9;
}
}

AdvancedMemberStrategy.java 高级会员

1
2
3
4
5
6
7
public class AdvancedMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println("对于高级会员的折扣为20%");
return booksPrice * 0.8;
}
}

Price.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Price {

private MemberStrategy strategy;


public Price(MemberStrategy strategy) {
this.strategy = strategy;
}

/**
* 计算图书的价格
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
public double quote(double booksPrice){
return this.strategy.calcPrice(booksPrice);
}
}

Test.java

1
2
3
4
5
6
7
8
9
10
11
12
public class Test {

public static void main(String[] args) {
//选择并创建需要使用的策略对象
MemberStrategy strategy = new AdvancedMemberStrategy();
//创建环境
Price price = new Price(strategy);
//计算价格
double quote = price.quote(300);
System.out.println("图书的最终价格为:" + quote);
}
}