首页 > 其他分享 >行为型模式-策略模式

行为型模式-策略模式

时间:2022-10-28 15:37:41浏览次数:45  
标签:策略 void 模式 Strategy 算法 行为 public

概述

先看下面的图,我们去旅游选择出行模式有很多种,可以骑自行车,可以坐汽车,可以坐火车,可以坐飞机

 

作为一个程序员,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具

 

 

 

定义

该模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响使用算法的客户,策略模式属于对象行为模式,他通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理

结构

策略模式的主要角色如下:

  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用

案例实现

【例】促销活动

一家百货公司在定年度的促销活动,针对不同的节日(春节,中秋节,圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户,类图如下

 

 

 代码如下

//抽象策略类
public interface Strategy {

    void show();
    
}

 

public class StrategyA implements Strategy{

    @Override
    public void show() {
        System.out.println("买一送一");
    }
}

class StrategyB implements Strategy{

    @Override
    public void show() {
        System.out.println("满200减50");
    }
}

class StrategyC implements Strategy{

    @Override
    public void show() {
        System.out.println("满1000元加1元换购任意200元以下商品");
    }
}

 

 

//促销员(环境类)
@Getter
@Setter
public class SaleMan {

    //聚合策略类对象
    private Strategy strategy;

    public SaleMan(Strategy strategy) {
        this.strategy = strategy;
    }

    //由促销员把促销活动展示给用户
    public void saleManShow() {
        strategy.show();
    }

}

 

 

    public static void main(String[] args) {
        //买一送一
        SaleMan saleMan = new SaleMan(new StrategyA());
        saleMan.saleManShow();

        System.out.println("===========================");
        saleMan.setStrategy(new StrategyB());
        saleMan.saleManShow();

        System.out.println("===========================");
        saleMan.setStrategy(new StrategyC());
        saleMan.saleManShow();
    }

 

输出

 

 优缺点

优点

  • 策略类之间可以自由切换

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

  • 易于拓展

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

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

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量

使用场景

  • 一个系统需要动态的在几种算法中选择一种时,可将每个算法封装到策略类中
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入他们各自的策略类中以代替这些条件语句
  • 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时
  • 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构

 

JDK源码分析

Comparator中的策略模式。在Arrays类中有一个sort() 方法,

 

标签:策略,void,模式,Strategy,算法,行为,public
From: https://www.cnblogs.com/lpzjava/p/16831205.html

相关文章

  • vs2015中搭建EF框架在代码生成策略中找不到“旧的ObjectContext
    vs2015中搭建EF框架在代码生成策略中找不到“旧的ObjectContext”生生不息0.o于2022-01-0617:28:10发布429收藏分类专栏:C#EF文章标签:c#软件框架版权C#同时被......
  • Java-五种线程池,四种拒绝策略,三类阻塞队列
    Java-五种线程池,四种拒绝策略,三类阻塞队列(常用)三类阻塞队列:   //1有界队列   workQueue=newArrayBlockingQueue<>(5);//基于数组的先进先出(FIFO)队列,支持公......
  • 结构性型模式概述01--代理模式
    结构性型模式概述:Java-JDK动态代理详解(AOP)动态代理是如何实现的?JDKProxy和CGLib有什么区别?文章目录​​结构性型模式概述:​​​​[Java-JDK动态代理详解(AOP)](java......
  • 设计模式00----七大原则
    设计模式只是实现了七大原则的具体方式,套用太多的设计模式只会陷入模式陷阱,最后代码写的凌乱不堪在实际工作中很少会规定必须使用哪种设计模式,这样只会限制别人。不能为了......
  • 创建型模式03----建造者模式
    建造者模式(Bulider模式)相关优秀的文章—秒懂设计模式之建造者模式文章目录​​建造者模式(Bulider模式)​​​​模式的定义和特点​​​​建造者定义:​​​​优点​​​......
  • 创建型模式02----原型模型--工厂方法模式 --抽象工厂模式
    文章目录​​原型模型​​​​定义:​​​​优点:​​​​缺点:​​​​原型模式的结构与实现​​​​模式的实现​​​​原型模式的引用场景​​​​创建型模式-工厂模式​......
  • 创建型模式01----单例模式
    创建型模式的特点和分类创建型模式的关注点是"怎样创建对象",特点:将对象的创建与使用分离,这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的......
  • 结构性型模式概述02--适配器模式--桥接模式
    文章目录​​适配器模式(Adapter模式)详解​​​​优点:​​​​缺点:​​​​模式的结构与实现​​​​模式结构:​​​​模式的应用场景​​​​桥接模式(Bridge模式)详解​......
  • Java面向对象以及优缺点-秋招面试--使用线程池的好处--拒绝策略
    文章目录​​方法重写规则​​​​7.合成复用原则​​​​通常类的复用分为两种:继承复用和合成复用两种,​​​​封装​​​​继承的优缺点​​​​继承:​​​​两小:​​......
  • 设计模式之组合模式
    概述对于树形结构,当容器对象(例如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使......