设计模式-策略

1.核心:对应于解决某个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或增加新的算法,由客户端决定调用哪个算法
2.角色:
<1>上下文对象:该类中实现了对抽象策略中定义的接口或抽象类的引用
<2>抽象策略对象:通常由一个接口或抽象类实现,给出所有的具体策略类所需的接口
<3>具体策略:封装了实现不同功能的不同算法
3.开发业务场景:
-javase中GUI编程中,布局管理
-spring框架中,Resource接口,资源访问策略
-javax.servlet.http.HttpServlet#service()中的doPost,doGet方法选择
4.示例代码:
<1>抽象角色

//抽象角色(定义具体策略应该实现的所有算法)
public interface Strategy {
    double getPrice(double standardPrice);
}

<2>具体策略角色(算法族)

//具体策略角色
public class NewAndFewStrategy implements Strategy {
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("原价,不打折");
        return standardPrice;
    }

}

//具体策略角色2
public class NewAndManyStrategy implements Strategy {
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("大批量新用户,打9折");
        return standardPrice*0.9;
    }

}

//具体策略角色3
public class OldAndFewStrategy implements Strategy {
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("小批量老用户,打85折");
        return standardPrice*0.85;
    }

}

//具体策略角色4
public class OldAndManyStrategy implements Strategy {
    @Override
    public double getPrice(double standardPrice) {
        System.out.println("大批量老用户,打8折");
        return standardPrice*0.8;
    }
}
<3>上下文对象
/**
 * 上下文对象,持有对抽象策略角色的引用
 * 负责和具体的策略类交互,这样就可以实现具体的算法和客户端调用的分离,使算法可以独立于客户端变化
 * @author Administrator
 *
 */
public class Context {
    private Strategy strategy;
    //构造器注入
    public Context(Strategy strategy) {
        super();
        this.strategy = strategy;
    }
    //setter方法注入
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    public void printPrice(double standardPrice){
        System.out.println("用户最终价格为:"+strategy.getPrice(standardPrice));
    }

}
<4>客户端调用
//客户端
public class Client {
    public static void main(String[] args) {
        Strategy strategy=new OldAndFewStrategy();
        Context context=new Context(strategy);
        context.printPrice(100);
    }
}

执行结果

小批量老用户,打85折
用户最终价格为:85.0

5.示例用类图:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值