策略模式
来源:互联网 发布:数据分析入门书籍 编辑:程序博客网 时间:2024/05/07 23:32
设计一个当当购物网站
算法一:对初级会员没有折扣
算法二:对中级会员提供10%的促销折扣
算法三:对高级会员提供20%的促销折扣
抽象折扣类
public interface MemberStrategy {
/**
* 计算图书的价格
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
public double calcPrice(double booksPrice);
}
初级会员折扣类
public class PrimaryMemberStrategy implements MemberStrategy{
@Override
public double calcPrice(double booksPrice){
System.out.println(“对于初级会员没有折扣”);
return bookPrice;
}
}
中级会员折扣类
public class PrimaryMemberStrategy implements MemberStrategy{
@Override
public double calcPrice(double booksPrice){
System.out.println(“对于初级会员折扣为%10”);
return bookPrice*0.9;
}
}
高级会员折扣类
public class PrimaryMemberStrategy implements MemberStrategy{
@Override
public double calcPrice(double booksPrice){
System.out.println(“对于高级会员折扣为20%”);
return bookPrice*0.8;
}
}
价格类
public class Price{
private MemberStrategy strategy;
/**
* 构造函数,传入一个具体的策略对象
* @param strategy 具体的策略对象
*/
public Price(MemberStrategy strategy){
this.strategy=strategy;
}
/**
* 计算图书的价格
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
Public double quote(double bookSPrice){
return this.strategy.calcPrice(booksPrice);
}
}
客户端
public class Client{
Public static void main(String[] args){
//选择并创建使用的策略对象
MemberStrategy strategy=new AdvancedMemberStrategy();
//创建环境
Price price=new Price(strategy);
//计算价格
Double quote=price.quote(300);
System.out.println(“图书的最终价格为:”+quote);
}
}
针对一组算法,将每一个算法封装到具有共同接口的独立类中,使得它们恶意相互替换。
涉及三个角色
1.环境角色,持有一个strategy的引用
2.抽象策略角色,同常是一个接口或抽象类,封装了具体需要的接口或抽象方法
3.实现角色,具体实现相同接口(抽象类)的不同的算法
实现类通过继承环境角色,通过构造传入不同的参数调用不同的方法,父类相同,体现了类的多态性
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
组成
-抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
-具体策略角色:包装了相关的算法和行为。
-环境角色:持有一个策略类的引用,最终给客户端调用。
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- Linux设置有效的防火墙策略禁止所有非法的请求
- ARM Linux中断机制之中断处理
- 搭建Linux服务器下网站
- LitePal的使用
- Python二分查找算法
- 策略模式
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 LCT
- 单例设计模式
- ARM嵌入式LINUX启动过程(大师级人物)
- 山东省第八届ACM省赛F.quadratic equation
- 关于JScrollPane如何背景如何设置透明的方
- java Swing的继承关系
- ReactJs学习之生命周期及事件
- ImportError: No module named setuptools 报错