设计模式学习-《策略模式》

策略模式

问题描述:

  • 有各种鸭子(北京鸭、玩具鸭),鸭子有各种行为(叫、飞)
  • 希望能够实现不同的鸭子,显示不同鸭子的信息

传统方法会创建一个抽象类

java 复制代码
    public abstract class Duck{
        public Duck(){
            
        }
        
        public abstract  void display();//显示鸭子信息
        
        public void fly(){
            System.out.println("鸭子会飞翔");
        }
    }

这时候我们要实现具体的鸭子,如玩具鸭,得重写Duck类里的所有方法,因为玩具鸭不会飞。如果要实现北京鸭,又得重写Duck类里的所有方法,因为北京鸭飞飞行能力一般。

传统方式存在问题:

  • 其他鸭子都继承了Duck类,所有fly让所有的子类都会飞了,这是不正确的
  • 即继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分,会有溢出效应

这时引出策略模式

  • 策略模式中,定义算法族(策略组) ,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

我的理解是:

把原来继承的部分换成一个插槽,这个插槽在策略模式中是一个接口。不同的类插槽处的具体实现不一样,这时候我们可以搭建很多个不一样的积木(策略组),用哪一个就把哪一个积木放到插槽里,不用对插槽进行重新改动,这样后面的其他人也可以重复使用这个积木。策略模式中具体的实现是:积木即继承了接口的实现类,使用哪一个实现了就将其赋值给接口即可,不用重新接口方法。

实例:

策略模式的原则就是,分离变化部分,封装接口,基于接口编程各种功能

将原来的方法定义改成策略接口(创建一个插槽)

java 复制代码
public abstract class Duck{
    
    //属性,策略接口
    FlyBehavior flyBehavior;

    public abstract  void display();//显示鸭子信息

    public void fly(){
        //改进
        if(flyBehavior!=null){
            flyBehavior.fly();
        }
    }
    
    //提供给用户,动态变化行为动作(更换插槽里的积木调用这个方法就行)
    public  void setFlyBehavior(FlyBehavior flyBehavior){
        this.flyBehavior = flyBehavior;
    }
}

策略接口:

java 复制代码
public interface FlyBehavior {
    void fly();//子类的具体实现
}

策略组的实现(实现放到接口里的积木):

java 复制代码
public class GoodFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("飞翔技术高超");
    }
}
java 复制代码
public class NoFlyFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("不会飞翔");
    }
}

不同鸭子的实现:

java 复制代码
public class ToyDuck extends Duck{

    @Override
    public void display() {
    	//把想放的积木放到插槽里
        flyBehavior = new NoFlyFlyBehavior();
    }
}
java 复制代码
public class BeiJingDuck extends Duck{

    @Override
    public void display() {
        flyBehavior = new GoodFlyBehavior();
    }
}

即将项目中变化的部分分离出来,多用组合/聚合,少用继承;用行为类组合,而不是行为的继承。

体现了"对修改关闭,对扩展开放"原则,客户端增加行为不用修改原有代码,只需要添加一种策略即可。

需要注意的是:没添加一个策略就需要增加一个类,当策略过多是会导致类数目庞大。

相关推荐
GIS之路2 小时前
GeoTools 基础概念解析
数据库·设计模式·oracle
归云鹤6 小时前
设计模式二:策略模式 (Strategy Pattern)
设计模式·策略模式
心平愈三千疾7 小时前
学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)
java·分布式·学习
玩代码7 小时前
备忘录设计模式
java·开发语言·设计模式·备忘录设计模式
艾莉丝努力练剑9 小时前
【数据结构与算法】数据结构初阶:详解顺序表和链表(四)——单链表(下)
c语言·开发语言·数据结构·学习·算法·链表
心疼你的一切11 小时前
Unity 多人游戏框架学习系列一
学习·游戏·unity·c#·游戏引擎
vvilkim12 小时前
深入理解设计模式之外观模式:简化复杂系统的艺术
设计模式·外观模式
Chef_Chen13 小时前
从0开始学习R语言--Day47--Nomogram
学习
毕设源码柳学姐14 小时前
计算机毕业设计Java医学生在线学习平台系统 基于 Java 的医学生在线学习平台设计与开发 Java 医学在线教育学习系统的设计与实现
java·学习·课程设计
永日4567015 小时前
学习日记-spring-day46-7.11
java·学习·spring