博客
关于我
二十三种设计模式(第二十二种)-----策略模式(Strategy)
阅读量:491 次
发布时间:2019-03-07

本文共 2498 字,大约阅读时间需要 8 分钟。

二十三种设计模式(第二十二种)-----策略模式(Strategy)

尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470

类图

类图

从上图可以看到,客户context有成员变量strategy或者其他的策略接口,至于需要使用到那个策略,我们可以在构造器中指定

需求

有各种鸭子(如:野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等待)

显示鸭子的信息

需求类图

需求类图

代码

1.鸭子抽象类

public abstract class Duck {    //策略接口    protected FlyBehavior flyBehavior;    public abstract void display();    public void quack() {        System.out.println("鸭子嘎嘎叫~~~");    }    public void swim() {        System.out.println("鸭子会游泳~~~");    }    public void fly() {        if (flyBehavior != null) {            flyBehavior.fly();        }    }    public void setFlyBehavior(FlyBehavior flyBehavior) {        this.flyBehavior = flyBehavior;    }}

2.鸭子飞接口

public interface FlyBehavior {    void fly();}

3.不同鸭子实现类

public class WildDuck extends Duck {    public WildDuck() {        flyBehavior = new GoodFlyBehavior();    }    @Override    public void display() {        System.out.println("这是野鸭....");    }}//================================public class PekingDuck extends Duck {    public PekingDuck() {        flyBehavior = new BadFlyBehavior();    }    @Override    public void display() {        System.out.println("这是北京鸭子...");    }}//================================public class ToyDuck extends Duck {    public ToyDuck() {        flyBehavior = new NoFlyBehavior();    }    @Override    public void display() {        System.out.println("这是玩具鸭...");    }    @Override    public void quack() {        System.out.println("玩具鸭不能叫...");    }    @Override    public void swim() {        System.out.println("玩具鸭不能游泳...");    }}

4.不同飞实现类

public class GoodFlyBehavior implements FlyBehavior {    @Override    public void fly() {        System.out.println("飞翔技术高超...");    }}//================================public class BadFlyBehavior implements FlyBehavior {    @Override    public void fly() {        System.out.println("飞翔技术一般...");    }}//================================public class NoFlyBehavior implements FlyBehavior {    @Override    public void fly() {        System.out.println("不会飞...");    }}

5.客户端

public class Strategy {    public static void main(String[] args) {        WildDuck wildDuck = new WildDuck();        wildDuck.fly();        PekingDuck pekingDuck = new PekingDuck();        pekingDuck.fly();        ToyDuck toyDuck = new ToyDuck();        toyDuck.fly();        //更改pekingDuck飞行行为        pekingDuck.setFlyBehavior(new NoFlyBehavior());        pekingDuck.fly();    }}

策略模式在JDK的Arrays.sort()方法中实现

参数Comparator接口为策略接口

转载地址:http://kmbcz.baihongyu.com/

你可能感兴趣的文章
Nacos和Zookeeper对比
查看>>
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos基础版 从入门到精通
查看>>
Nacos如何实现Raft算法与Raft协议原理详解
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(上)
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
查看>>
Nacos心跳机制实现快速上下线
查看>>
nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
查看>>
nacos服务提供和发现及客户端负载均衡配置
查看>>
Nacos服务注册与发现demo
查看>>
Nacos服务注册与发现的2种实现方法!
查看>>
nacos服务注册和发现原理简单实现案例
查看>>
Nacos服务注册总流程(源码分析)
查看>>
nacos服务注册流程
查看>>
Nacos服务部署安装
查看>>
nacos本地可以,上服务器报错
查看>>
Nacos注册Dubbo(2.7.x)以及namespace配置
查看>>
Nacos注册中心有几种调用方式?
查看>>
nacos注册失败,Feign调用失败,feign无法注入成我们的bean对象
查看>>