美文网首页
设计模式思考(一)策略模式

设计模式思考(一)策略模式

作者: lhsjohn | 来源:发表于2018-12-09 15:14 被阅读0次

    策略模式的定义:

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

    OO基础

    • 抽象
    • 封装
    • 多态
    • 继承

    OO原则

    • 封装变化
    • 多用组合,少用继承
    • 针对接口编程,不针对实现编程

    OO模式

    • 本篇介绍的是策略模式

    策略模式的实例:

    下面举一个Duck类的实例来说明策略模式

    Duck(鸭子)类是所有类的基类

     Public abstract class Duck {
    
        //为行为接口类型声明两个引用变量,所有鸭子子类(在同一个package中)都继承它们。
      
        FlyBehavior flyBehavior;
      
        QuackBehavior quackBehavior;
       
        Public Duck() {}
    
        Public abstract void display();
       
          Public void performFly(){
          //委托给行为类
          flyBehavior.fly();
        }
    
        Public void performQuack(){
         quackBehavior.quack();
        }
    
        Public void swim(){
        System.out.println(“所有的鸭子都会游泳”);
        }
        
      
    }
    
    

    飞行行为接口

        public interface FlyBehavior {
             public void fly();
       }
    
     
        //这是飞行类的实现,适用于会飞的鸭子
        Public class FlyWithWings implements FlyBehavior{
    
            Public void fly(){
            System.out.println(“I’m flying!!”);
          }
        }
    
    
        //这也是飞行类的实现,给不会飞的鸭子用,如橡皮鸭等
        Public class FlyNoWay implements FlyBehavior{
        
             Public void fly(){
             System.out.println(“我不会飞”);
            }
        }
     
    
      ##  QuackBehavior 接口及其实现
    
    
         Public interface QuackBehavior {
            Public void quack();
        }
    
    
        Public class Quack implements QuackBehavior{
         Public void quack(){
            System.out.println(“Quack”);
          }
       }
    
       Public class MuteQuack implements QuackBehavior{
        Public void quack(){
            System.out.println(“<< Silence >>”);
          }
       }
    
       Public class Squeak implements QuackBehavior{
        Public void quack() {
           System.out.println(“Squeak”);
        }
    }
    
    

    下面我们给这些Duck动态设定行为

    在Duck 类中加入两个新的方法

     Public void setFlyBehavior (FlyBehavior fb)
    { 
        flyBehavior=fb;
    }
    
    
    Public void setQuackBehavior (QuackBehavior qb)
    {
         quackBehavior =qb;
    }
    
    

    创建一个新的鸭子,模型鸭。

       Public class ModelDuck extends Duck{
        
         Public ModelDuck(){
             flyBehavior =new FlyNoWay();
             quackBehavior=new Quack();
        }
        
         Public void display(){
           System.out.println(“我是模型鸭”);
        }
     }
    

    建立一个新的FlyBehavior 类型

    
      Public class FlyRocketPowered implements FlyBehavior {
         Public void fly(){
            System.out.println(“我是火箭驱动飞行的”);
         }
     }
    
    
    

    测试类进行测试

       Public class TestDuck(){
         Public static void main(String[] args){
               Duck model=new ModelDuck(); 
            //第一次调用performFly()会被委托给flyBehavior对象,也就是FlyNoWay的实例,该对象
            //是在模型鸭构造器中设置的
              Model.performFly();
            //这里调用继承来的setter方法,给它指定特定的飞行行为
               Model.setFlyBehavior(new FlyRocketPowered());
               Model.performFly();
        }
     }
    

    测试结果

    控制台输出

    我不会飞
    我是火箭驱动飞行的
    

    下面是相关类和接口的关系图


    2018-07-30.png

    收集的一些写的有关策略模式的比较好的博客

    1.【设计模式--spring源码中使用策略模式(Strategy Pattern)】

    https://blog.csdn.net/lzwglory/article/details/51822442

    2.【策略模式和Spring的结合在项目中的应用】

    https://blog.csdn.net/zlts000/article/details/54754789

    3.【设计模式(一)策略模式】

    https://www.cnblogs.com/jenkinschan/p/5645300.html

    4.【深度剖析策略模式(包括该模式在JDK中的应用)】

    https://www.cnblogs.com/lewis0077/p/5133812.html

    作者:lhsjohn

    相关文章

      网友评论

          本文标题:设计模式思考(一)策略模式

          本文链接:https://www.haomeiwen.com/subject/yztkhqtx.html