策略模式

策略模式

策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们可以相互替换。
策略模式让算法独立于使用它的客户而独立变化。

具体角色

1:Strategy(抽象策略类):
定义一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法。抽象策略类一般使用接口或抽象类实现。
2:Context(应用场景):
需要使用ConcreteStrategy提供的算法,内部维护一个Strategy的实例,负责动态设置运行时Strategy具体实现的算法,负责跟Strategy的交互与传递。
3:ConcreteStrategy(具体策略类):
实现Strategy定义的接口,提供具体的算法实现。

UML模型图

这里写图片描述

例:

需求:

现商场计算总额,已知有几种不同的活动类型:正常,打折,满减。

实现思路:

客户端输入总额,并选择相应的活动进行总额计算。
服务器端提供相应的算法实现,由客户端进行具体的算法实例创建。算法的实现具体细节对客户端是封装的。

代码实现

抽象策略类:

/**
 * *策略模式
 * *抽象策略角色:活动接口
 */
public interface CashStrategy {
    /**
     * 返回经过活动之后的金额
     * @param money
     * @return
     */
    double acceptCash( double money );
}

具体实现策略类:

/**
 * ---策略模式---
 *  具体实现策略:打折返回子类
 *
 */
public class CashSale implements CashStrategy{

    private double sale;

    /**
     * @param sale 折扣
     */
    public CashSale(double sale){
        this.sale=sale;
    } 
    @Override
    public double acceptCash(double money) {
        // TODO Auto-generated method stub
        return money*sale;
    }

}
/**
 * ---策略模式---
 *  具体实现策略:正常返回子类
 */
public class CashNoramal implements CashStrategy{

    @Override
    public double acceptCash(double money) {
        // TODO Auto-generated method stub
        return money;
    }

}
/**
 * ---策略模式---
 * 具体实现策略:满减活动实现类
 *
 */
public class CashFullMinus implements CashStrategy{

    private double full;

    private double minus;

    /**
     * @param full   满额
     * @param minus  减额
     */
    public  CashFullMinus( double full,double minus) {
        // TODO Auto-generated constructor stub
        this.full=full;
        this.minus=minus;
    }

    @Override
    public double acceptCash(double money) {
        // TODO Auto-generated method stub
        if (money>=full) {
            money=money-minus;
        }
        return money;
    }

}

应用环境实现类

/**
 * ---策略模式---
 * 环境角色:策略类的应用
 */
public class CashContext {

    private CashStrategy cashStrategy;

    public CashContext(CashStrategy cashStrategy){
        this.cashStrategy=cashStrategy;
    }

    public double acceptCash(double money){
        return cashStrategy.acceptCash(money);
    }
}

客户端调用:

public static void main(String[] args) {
    double sunMoney=500;
    CashContext cashContext1=new CashContext(new CashNoramal());
    System.out.println(cashContext1.acceptCash(sunMoney));
    CashContext cashContext2=new CashContext(new CashSale(0.7));
    System.out.println(cashContext2.acceptCash(sunMoney));
    CashContext cashContext3=new CashContext(new CashFullMinus(400,60));
    System.out.println(cashContext3.acceptCash(sunMoney));

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值