策略设计模式

模式定义

定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换

使用场景

  1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
  2. 一个系统需要动态地在几种算法中选择一种

例子

定义抽象策略角色(Strategy):百货公司所有促销活动的共同接口

public abstract class Strategy {  
    public abstract void Show();
}

定义具体策略角色(Concrete Strategy):每个节日具体的促销活动

//为春节准备的促销活动A
class StrategyA extends Strategy{
    @Override
    public void show() {
        System.out.println("为春节准备的促销活动A");
    }
}

//为中秋节准备的促销活动B
class StrategyB extends Strategy{
    @Override
    public void show() {
        System.out.println("为中秋节准备的促销活动B");
    }
}

//为圣诞节准备的促销活动C
class StrategyC extends Strategy{
    @Override
    public void show() {
        System.out.println("为圣诞节准备的促销活动C");
    }
}

定义环境角色:用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员

class SalesMan{
	//持有抽象策略角色的引用
    private Strategy strategy;
    //生成销售员实例时告诉销售员什么节日(构造方法)
    //使得让销售员根据传入的参数(节日)选择促销活动(这里使用一个简单的工厂模式)
    public SalesMan(String festival) {
        switch ( festival) {
            //春节就使用春节促销活动
            case "A":
                strategy = new StrategyA();
                break;
            //中秋节就使用中秋节促销活动
            case "B":
                strategy = new StrategyB();
                break;
            //圣诞节就使用圣诞节促销活动
            case "C":
                strategy = new StrategyC();
                break;
        }
    }

    //向客户展示促销活动
    public void SalesManShow(){
        strategy.show();
    }

}

客户端调用-让销售员进行促销活动的落地


public class StrategyPattern{

        SalesMan mSalesMan ;
        //春节来了,使用春节促销活动
        System.out.println("对于春节:");
        mSalesMan =  SalesMan SalesMan("A");
        mSalesMan.SalesManShow();
        
        //中秋节来了,使用中秋节促销活动
        System.out.println("对于中秋节:");
        mSalesMan =  SalesMan SalesMan("B");
        mSalesMan.SalesManShow();

        //圣诞节来了,使用圣诞节促销活动
        System.out.println("对于圣诞节:");
        mSalesMan =  SalesMan SalesMan("C");
        mSalesMan.SalesManShow();  
  }   
}

结果输出:

对于春节:
为春节准备的促销活动A
对于中秋节:
为中秋节准备的促销活动B
对于圣诞节:
为圣诞节准备的促销活动B

总结

优点:

  1. 算法可以自由切换
  2. 避免使用多重条件判断
  3. 扩展性良好

缺点:

  1. 策略类会增多
  2. 所有策略类都需要对外暴露
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值