博客
关于我
二十三种设计模式(第二十二种)-----策略模式(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/

你可能感兴趣的文章
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>