zoukankan      html  css  js  c++  java
  • [设计模式]策略模式

    一、策略模式的定义与特点

    1、定义:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的用户。

    2、优点:

    • 类的行为被封装进一组类中,可以被轻易地扩充与改变,如果需要,甚至可以在运行时改变行为
    • 多重条件语句不易维护,使用策略模式可以避免使用多重条件语句。
    • 提供相同行为的不同实现,可以根据不同条件选择不同的行为。
    • 扩展性好,方便增加新的行为实现,不用修改原代码,只要增加即可。

    3、缺点:

    • 策略类数量可能会很多,每个策略都是一个类,复用的可能性小
    • 所有的策略类都要对外暴露

     

    二、策略模式满足的OO设计原则:

    1、找出应用中可能需要变化之处,把它们独立出来进行封装,不要和那些不需要变化的代码混在一起,这样做的好处是:一旦它真的变化了,只要更改相应部分即可,其他部分不会受到影响,这样代码变化引起的不经意后果变少,系统变得更有弹性。

    2、针对接口编程,而不是针对实现编程,即尽量将需要实现的功能/系统先进行抽象总结,形成接口,而具体的行为或者说实现部分作为可能会变化的部分,独立出来单独编码,一旦变化则其引起的后果会降低。

    3、多用组合,少用继承。

     

    三、策略模式的结构

    1、抽象策略类:定义了公共接口

    2、具体策略类:封装了具体的实现算法或行为,继承自抽象策略类

    3、上下文/环境:用来维护一个对抽象策略类的对象的引用

     

    四、策略模式的应用

    1、何时使用:一个系统有许多类,而区分它们的只是它们的行为时

    2、使用场景:算法或者说策略需要自由切换的场景;

    3、注意事项:如果一个系统的策略多于四个,需要考虑使用混合模式来解决策略类膨胀的问题

     

    五、具体实现(完整代码保存在github上)

    1、抽象策略类:定义公共接口

    public abstract class Duck{
        FlyBehavior flyBehavior;
        QuackBehavior quackBehavior;
        public Duck(){
        }
    
        public abstract void display();
    
        public void performFly(){
            flyBehavior.fly();
        }
        public void performQuack(){
            quackBehavior.quack();
        }
    
        public void swin(){
            System.out.println("All ducks float,even decoys!");
        }
    }
    

    2、具体策略类:封装具体的实现行为

    (1)封装鸭子叫的行为

    public class Quack implements QuackBehavior{
        public void quack(){
            System.out.println("Quack");
        }
    }
    

    (2)封装鸭子的飞行方式

    public class FlyWithWings implements FlyBehavior{
        public void fly(){
            System.out.println("I'm flying!");
        }
    }
    

    3、上下文/环境:维护对抽象策略类的引用

    public class MallardDuck extends Duck{
        public MallardDuck(){
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
    
        public void display(){
            System.out.println("I'm a real Mallard duck");
        }
    }
    

    4、调用上述代码

    public class MiniDuckSimulator{
        public static void main(String[] args){
            Duck mallard = new MallardDuck();
            mallard.performQuack();
            mallard.performFly();
        }
    }

     最终的输出结果是: 

     

     

     

     

    参考资料

    [1] Head First 设计模式

    [2] https://www.cnblogs.com/adamjwh/p/11011095.html

  • 相关阅读:
    解决SSH窗口关闭,linux上的应用也关闭
    Spring 自定义配置类bean
    java 图片文字识别 ocr
    解决Oracle在Linux下Listener起不来,error 111错误
    java 切图 判断图片是否是纯色/彩色图片
    java 二维码编码解码
    字符串整体大小写转换,首字母大小写
    oracle 解锁表的一个小问题
    mysql-如何完全删除主从同步
    oracle RAC ONLINE INTERMEDIATE shdb1 Stuck Archiver
  • 原文地址:https://www.cnblogs.com/mj-selina/p/12446289.html
Copyright © 2011-2022 走看看