设计模式学习笔记:策略模式

Posted 滴滴哒滴哒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式学习笔记:策略模式相关的知识,希望对你有一定的参考价值。

策略模式

一、策略模式的定义:

       策略模式是指对一系列的算法进行定义,并将每一个算法进行封装,使它们可以相互替换。算法独立于使用它们的客户变化。

二、策略模式的应用场景:

      “什么”做“什么”,而后面这个动作是可变的。

       多个类只区别在表现行为不同(多个类里面中的某些个方法不同),则可以使用策略模式,在运行时我们即可以动态选择具体执行的行为。


       在没有策略模式之前,在面对多个类存在行为不同,我们可能会选择继承(extends)的方式,然后用重写的方式去覆盖超类的行为。但是这种方法会存在问题:

1.如果存在某些类的某些方法相同,这样会造成代码在多个子类中重复;

2.运行时,行为无法改变;

3.代码扩展时,不容易实现;


这时候我们就可以采用策略模式。我们先把找出应用中可能需要变化的地方独立出来,也就是上面所说需要重写的部分


拿head first的例子来说

Duck有哪些品种呢,ModelDuck和MallardDuck(ModelDuck IS-A Duck,MallardDuck IS-A Duck)

Duck有哪些方法呢,飞,游泳,叫(Duck HAS-A fly,Duck HAS-A quack,Duck HAS-A swim):

1.飞,有些鸭子就不会飞,有些鸭子用翅膀飞(MallardDuck),有些用火箭飞(模型鸭ModelDuck),

2.游泳,基本都会。

3.叫,叫声又各有不同。

在例子中我们将fly(),quack()视为可变的(我们在这里主要讨论fly()),swim()视为不变的,将可变方法和不变方法分离。我们将可变的方法设置为接口,而swim()不用去管。

quack接口

public interface QuackBehavior 
    void quack();

fly接口
public interface FlyBehavior 
    void fly();

MallardDuck用翅膀飞,ModelDuck用火箭飞,用两个fly()方法去实现这个接口

public class FlyWithWings implements FlyBehavior 
    @Override
    public void fly()
        System.out.println("用翅膀飞");
    

public class FlyRocketPowered implements FlyBehavior 
    @Override
    public void fly()
        System.out.println("用火箭飞");
     

下面来写父类Duck

public class Duck 
    //fly()的接口
    FlyBehavior flyBehavior;
    //squack()的接口
    QuackBehavior quackBehavior;

    //setFlyBehavior()方法来动态改变fly()
    public void setFlyBehavior(FlyBehavior fb)
        flyBehavior = fb;
    
    //setQuackBehavior()方法动态改变quack()
    public void setQuackBehavior(QuackBehavior qb)
        quackBehavior = qb;
    

    //具体运行quack()
    public void performQuack()
        quackBehavior.quack();
    
    //具体运行fly()
    public void performFly()
        flyBehavior.fly();
    

    //不变的swim()
    public void swim()
        System.out.println("游泳");
    
    //不变的display()
    public void display()
        System.out.println("我是一只鸭子");
    

ModelDuck子类

public class ModelDuck extends Duck 


MallardDuck子类

public class MallardDuck extends Duck 
 

运行

public class RunProgram 
    public static void main(String[] args) 

        Duck model = new ModelDuck();
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();

        Duck mallard = new MallardDuck();
        mallard.setFlyBehavior(new FlyWithWings());
        mallard.performFly();
    

结果:


我们运用了策略模式可以使得我们得以在运行时动态改变方法,就不需要在每个Duck子类中Override fly()方法了,同时提高了我们代码的复用,便于我们后期的扩展



以上是关于设计模式学习笔记:策略模式的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]

First Head 设计模式之策略模式(Strategy Pattern)

设计模式–策略模式

设计模式–策略模式

设计模式之策略模式

设计模式之策略模式