java设计模式之策略模式

策略模式:又叫算法簇模式,即定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户;

使用策略模式的好处:我们可以动态的改变对象的行为;

对于策略模式的设计原则:

      把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为; 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

     策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用;

策略模式中有三个对象也可以叫做角色:
(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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值