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

2018-12-09  本文已影响0人  lhsjohn

策略模式的定义:

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

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

上一篇下一篇

猜你喜欢

热点阅读