《JAVA与模式》之策略模式

时间:2021-09-28 11:16:03

在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:

  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。

  这个模式涉及到三个角色:

  ●  环境(Context)角色:持有一个Strategy的引用。

  ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

demo:普通会员不打折,初级会员打8折,高级会员打5折

 

《JAVA与模式》之策略模式《JAVA与模式》之策略模式
package com.meicai.strategy;

/**
* Created by meicai on 2017/5/11.
*/
public interface IMemberStrategy {
/**
* 策略方法 计算会员价格
*
@param booksPrice
*
@return
*/
public double calcPrice(double booksPrice);
}
策略接口/抽象类

 

《JAVA与模式》之策略模式《JAVA与模式》之策略模式
package com.meicai.strategy;

/**
* 初级会员策略
* Created by meicai on 2017/5/11.
*/
public class ChuJiMemberStrategy implements IMemberStrategy {

@Override
public double calcPrice(double booksPrice) {
System.out.println(
"初级会员不打折");
return booksPrice;
}
}
初级会员策略

 

《JAVA与模式》之策略模式《JAVA与模式》之策略模式
package com.meicai.strategy;

/**
* 中级会员策略
* Created by meicai on 2017/5/11.
*/
public class ZhongJiMemberStrategy implements IMemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println(
"中级会员打8折");
return booksPrice*0.8;
}
}
中级会员策略

 

《JAVA与模式》之策略模式《JAVA与模式》之策略模式
package com.meicai.strategy;

/**
* 高级会员策略
* Created by meicai on 2017/5/11.
*/
public class GaoJiMemberStrategy implements IMemberStrategy {
@Override
public double calcPrice(double booksPrice) {
System.out.println(
"高级会员打5折");
return booksPrice*0.5;
}
}
高级会员策略

 

《JAVA与模式》之策略模式《JAVA与模式》之策略模式
package com.meicai.strategy;

/**
* 环境角色类
* Created by meicai on 2017/5/11.
*/
public class Price {
//持有一个具体策略的对象
private IMemberStrategy iMemberStrategy;
// 构造函数,传入一个具体策略对象
public Price(IMemberStrategy memberStrategy){
this.iMemberStrategy=memberStrategy;
}
//策略方法
public double getPrice(double bookPrice){
return this.iMemberStrategy.calcPrice(bookPrice);
}
}
环境角色类
《JAVA与模式》之策略模式《JAVA与模式》之策略模式
import com.meicai.strategy.GaoJiMemberStrategy;
import com.meicai.strategy.IMemberStrategy;
import com.meicai.strategy.Price;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;

/**
* Created by meicai on 2017/5/9.
*/
public class Test {
public static void main(String[] args) {

GaoJiMemberStrategy gaoJiMemberStrategy
=new GaoJiMemberStrategy();
Price price
=new Price(gaoJiMemberStrategy);
double dPrice= price.getPrice(10);
System.out.println(dPrice);
}
}
测试代码