前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅析几种设计模式--策略模式

浅析几种设计模式--策略模式

作者头像
田维常
发布2019-07-16 10:40:58
3990
发布2019-07-16 10:40:58
举报

策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

作用

将算法的责任和本身进行解耦,使得:

1.算法可独立于使用外部而变化

2.客户端方便根据外部条件选择不同策略来解决不同问题

策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。

实例

背景:有一家百货公司,最近在定年度的促销活动

冲突:每个节日用同一个促销活动太枯燥,没吸引力

解决方案:针对不同节目使用不同促销活动进行促销

步骤1:

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

代码语言:javascript
复制
public abstract class Strategy {  
    public abstract void showActivity();
}

步骤2:

定义具体策略角色(Concrete Strategy):

以下是每个具体活动

代码语言:javascript
复制
//为春节准备的促销活动A
class StrategyA extends Strategy{
    @Override
    public void showActivity() {
        System.out.println("春节促销活动A");
    }
}

//为中秋节准备的促销活动B
class StrategyB extends Strategy{

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

    @Override
    public void showActivity {
        System.out.println("圣诞节促销活动C");
    }
}

步骤3:

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

代码语言:javascript
复制
class Context_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;
        }
    }
代码语言:javascript
复制
   //向客户展示促销活动
    public void SalesManShow(){
        strategy.showActivity();
    }
代码语言:javascript
复制
public class StrategyPattern {
    public static void main(String[] args){
        Context_SalesMan mSalesMan ;

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

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

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

运行结果:

总结

优点

策略类之间可以自由切换

由于策略类都实现同一个接口,所以使它们之间可以自由切换。

易于扩展

增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“

避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

缺点

客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

策略模式的本质:少用继承,多用组合

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档