Android 设计模式--12:策略模式(Strategy P

2024-01-04  本文已影响0人  DarcyZhou

本文转载自:Carson带你学设计模式:策略模式(Strategy Pattern)

目录

设计模式12-1.PNG

1.介绍

1.1 定义

  定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换,并让算法可以在不影响到客户端的情况下发生变化。

简单来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”

1.2 作用

  使得客户端可以根据外部条件选择不同策略来解决不同问题。

2.模式原理

2.1 UML类图 & 组成

设计模式12-2.PNG

2.2 实例讲解

  接下来我用一个实例来对策略模式进行更深一步的介绍。

(1)实例概况

(2)使用步骤

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

public abstract class Strategy {  

    public abstract void Show();
}

步骤2:定义具体策略角色(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");
    }
}

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

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;
        }

    }

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

}

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


public class StrategyPattern{
    public static void main(String[] args){

        Context_SalesMan mSalesMan ;

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

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

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

结果输出

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

通过上述这个常见的生活例子,我相信你已经完全明白了策略模式的原理了!!

3.优缺点

  在全面解析完后,来分析下其优缺点:

3.1 优点

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

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

3.2 缺点

4.应用场景

5.总结

  本文主要对策略模式进行了全面介绍。

上一篇下一篇

猜你喜欢

热点阅读