java设计模式之策略模式
来源:互联网 发布:腾讯数据 编辑:程序博客网 时间:2024/06/06 20:44
策略模式:又叫算法簇模式,即定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户;
使用策略模式的好处:我们可以动态的改变对象的行为;
对于策略模式的设计原则:
把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为; 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用;
策略模式中有三个对象也可以叫做角色:
(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
策略模式的具体结构:
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
下面是一张示例图来解释设计模式结构:
这个模式涉及到三个角色:
● 环境(Context)角色:持有一个Strategy的引用。
● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
应用场景:假设小编开了一家水果店,为了更好地销售,推出了办理会员购买水果优惠制:
·初级会员:打95折;
·中级会员:打9折;
·高级会员:打85折;
对于这个问题可以用策略模式来实现:
·环境角色:价格类
·抽象角色:折扣类
·具体策略角色:初级会员折扣类,中级会员折扣类,高级会员折扣类
价格类:
package indiv.dyf.Context;import indiv.dyf.Strategy.MemberStrategy;public class Price { // 持有一个具体的策略对象 private MemberStrategy strategy; // 传入一个具体的策略对象 public Price(MemberStrategy strategy) { this.strategy=strategy; } public double cost(double fruitPrice) { return this.strategy.salePrice(fruitPrice); }}
折扣类:
package indiv.dyf.Strategy;/** * 计算水果的价格 * @param fruitPrice * 水果价格 * @return 计算出打折后的价格 */public interface MemberStrategy { double salePrice(double fruitPrice);}
初级会员折扣类:
package indiv.dyf.ConcreteStrategy;import indiv.dyf.Strategy.MemberStrategy;public class PrimaryPrice implements MemberStrategy { @Override public double salePrice(double fruitPrice) { System.out.println("初级会员打95折"); return fruitPrice * 0.95; }}中级会员的折扣类:
package indiv.dyf.ConcreteStrategy;import indiv.dyf.Strategy.MemberStrategy;public class MiddlePrice implements MemberStrategy { @Override public double salePrice(double fruitPrice) { System.out.println("中级会员打9折"); return fruitPrice * 0.9; }}高级会员的折扣类:
package indiv.dyf.ConcreteStrategy;import indiv.dyf.Strategy.MemberStrategy;public class SeniorPrice implements MemberStrategy { @Override public double salePrice(double fruitPrice) { System.out.println("高级会员打85折"); return fruitPrice * 0.85; }}
实现类:
package indiv.dyf.demo;import indiv.dyf.ConcreteStrategy.PrimaryPrice;import indiv.dyf.Context.Price;import indiv.dyf.Strategy.MemberStrategy;public class Demo { public static void main(String[] args) { // 选择并创建需要使用的策略对象 MemberStrategy primary=new PrimaryPrice(); // 创建环境 Price p=new Price(primary); // 计算价格 double cost=p.cost(50); System.out.println("水果最终价格(初级会员):" + cost); }}
- Java设计模式之策略设计模式
- Java设计模式之策略设计模式
- Java设计模式之策略
- Java设计模式之策略模式
- java设计模式之 策略模式
- JAVA 设计模式之 策略模式
- java设计模式之策略模式 Strategy
- java设计模式之策略模式
- java设计模式之策略模式
- 浅谈Java设计模式之---策略模式
- java设计模式之策略模式
- Java设计模式之策略模式
- java设计模式之策略模式
- Java设计模式之策略模式
- Java设计模式之策略模式
- java设计模式之策略模式
- 设计模式之策略模式(java)
- Java设计模式笔记之策略模式
- shipyard管理多HOST
- jsp和html的区别是什么
- JAVA反射机制深入学习(三)ClassLoader类装载器介绍
- Opticks依赖库的下载和编译
- H3C OAP之NAM流量分析模块 技术白皮书
- java设计模式之策略模式
- 递归方法实现树形数据
- 云盘选择
- 堆栈和队列知识总结
- Java中RMI的实现
- Nginx中运行403 forbidden错误
- github安装遇到的坑
- shell变量和环境变量
- 什么是servlet?