美文网首页
理解策略模式

理解策略模式

作者: 梦的飞翔_862e | 来源:发表于2018-11-07 18:35 被阅读0次

策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一组行为接口和具体的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。
设计策略模式时,需要分析项目中变化和不变的部分,将变化部分抽离出来, 定义为接口和实现。以分析鸭子为例,鸭子会叫,飞和游泳。不同鸭子叫的,飞的不一样。后面给出不使用策略模式和使用策略模式情况下类结构和具体代码实现
在不使用策略模式的情况下,类的结构是这样的:


image

代码实例
步骤 1:创建抽象类

public abstract class Duck {
public void fly() {
System.out.println("duck fly");
    }
public void quack() {
System.out.println("duck quack");
    }
public void swim() {
System.out.println("i am swimming");
    }
public abstract void  display();
}

步骤二:创建子类

GreenDuck.java:
public class GreenDuckextends Duck {
@Override
    public void display() {
System.out.println("this is a green duck");
    }
@Override
    public void fly() {
System.out.println("fly good");
    }

@Override
    public void quack() {
System.out.println("quack good");
    }
}
RedDuck.java:
public class RedDuckextends Duck {
@Override
    public void display() {
System.out.println("this is red duck");
    }
@Override
    public void fly() {
System.out.println("bad fly");
    }
@Override
    public void quack() {
System.out.println("no quack ");
    }
}

该结构的一个缺陷是,如果想更改RedDuck和GreenDuck中飞和叫的行为时,需要更改两个类中的fly()和quack()方法,当需要更改很多行为,且行为中代码有很多重复时,会造成不必要的代码冗余和时间浪费,也容易出错。这时,策略模式就是比较好的一个选择。
使用策略模式后的类图结构


image

代码实例:

步骤 1 创建行为接口和行为实现类

public interface FlyBehavior {
void fly();
}
public class GoodFlyBeihaviorimplements FlyBehavior {
@Override
    public void fly() {
System.out.println("good fly");
    }
}
public class BadFlyBehaviorimplements FlyBehavior {
@Override
    public void fly() {
System.out.println("bad fly");
    }
}

步骤二:定义抽象实体类

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    public Duck(FlyBehavior flyBehavior,QuackBehavior quackBehavior){
        this.flyBehavior=flyBehavior;
        this.quackBehavior=quackBehavior;
    }
    public void fly(){
        flyBehavior.fly();
    }
    public void quack(){
        quackBehavior.quack();
    }
    public  void swim(){
        System.out.println("i am swimming");
    }
    public abstract void display();
}

步骤三:定义具体实体类,继承抽象实体类

public class GreenDuck extends Duck {
   public  GreenDuck(){
       super(new GoodFlyBeihavior(),new GoodQuackBehavior());
   }
    @Override
    public void display() {
        System.out.println("this is a green duck");
    }
}

如果想替换子类中的行为,仅需像父类传递对应行为的实现类即可。

代码实例参见:https://github.com/jxl198/designPattern/tree/master/strategy

注意点:

在进行设计项目结构中,尽量少用集成,多用组合
策略模式一个明显的缺点是当备用行为过多时,行为对象会非常庞大

相关文章

  • 理解策略模式

    策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一组行为接口和具体的实现。策略模式最大的特点是行为的变化...

  • 策略模式

    由于策略模式和工厂模式很像 主要区别 我的理解: 工厂模式就是需要什么生产什么 策略模式就是根据已有的策略选择用什...

  • 设计模式-策略模式

    emmm.. 什么叫策略模式呢? 我接下会来通过吃鸡的武器来给大家讲解,以便于大家理解什么是策略模式 策略模式的...

  • 设计模式:(四)行为型模式

    一、策略模式 策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握,策略模式的三个角色: Context...

  • 018--IDEA王者荣耀学习设计模式

    1、写在前面 通过【王者荣耀】学习设计模式 2、核心操作 进行代码编写(策略模式+单例模式) 理解策略模式 3、具...

  • 设计模式之死磕策略模式(原创)

    本篇文章主要讲的是策略模式基本概念以及应用场景。 首先,策略模式是属于行为型模式的一种,为了更好的理解策略模式,我...

  • 2. 设计模式之策略模式

    一、定义 今天我们讨论的设计模式是「策略模式」,策略模式比较好理解,首先我们看一下他的定义: 策略模式是一种定义一...

  • 设计模式-策略模式理解

    同一个行为,用不同的方案可以去完成,这个方案我们可以叫他策略或者规则;通过对方案一个个的独立封装,结构更清晰,而且...

  • 策略模式

    策略模式定义: 定义了策略族,可以理解成各种算法,然后把每个策略(算法)封装起来,让它们之间可以互换。此模式让算法...

  • 24种设计模式

    读了大话设计模式一书.暂做总结,有的理解了,有的还不太理解,以后慢慢理解 1.简单工厂模式 2.策略模式 3.装饰...

网友评论

      本文标题:理解策略模式

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