理解策略模式

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


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

注意点:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 9,187评论 0 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,183评论 19 139
  • 当孩子多好,无论是开心还是悲伤都可以痛快展现,不像成年人,只将快乐与悲伤深藏。 孩子们放《同桌的你》,竟然想要哭泣...
    鸢尾风铃阅读 3,150评论 0 0
  • 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
    REIGE阅读 1,508评论 0 0
  • 回忆真的很美 可我没有眼泪 擦去身上的胭脂味 徒留孤单谁来陪 曾经以为 世界很美 我只想尝试回味 那一抹残阳 因苍...
    安嫚儿阅读 2,532评论 1 3

友情链接更多精彩内容