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);    }}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 研究生学费太贵怎么办 澳洲移民配额用不完怎么办 去美国探亲怎么办签证 去伊朗的签证怎么办 房产证被偷了怎么办 打黑工被发现怎么办 几年前被犬咬没打针怎么办 对狂犬疫苗过敏怎么办 想去墨尔本留学怎么办 大学没交学费会怎么办 交学费收据丢了怎么办 上海浦东金科苑幼儿园统筹怎么办 红酒瓶塞掉了怎么办 红酒瓶塞丢了怎么办 收入证明没有公章怎么办 父母没工作怎么办签证 在温哥华怎么办新西兰签证 上班第一天无聊怎么办 上班紧张不自信怎么办 销售到了30岁怎么办 转行会计没经验怎么办 澳洲coe被取消怎么办 父母不同意嫁远怎么办 家人不同意我们在一起怎么办 语言课申请不到怎么办 墨尔本大学均分不够怎么办 去澳洲旅游签证怎么办 换新护照澳大利亚签证怎么办 大学错过交学费日期怎么办 留学加拿大申请工签被拒怎么办 英国大学挂科怎么办 小孩子学不进去怎么办 大学生学不进去怎么办 高考没考上本科怎么办 想读书家里没钱怎么办 考上大学没钱上怎么办 儿子没考上大学怎么办 后悔没上大学怎么办 把学费花了怎么办 临床预科挂科怎么办 补录了预科怎么办