博客
关于我
二十三种设计模式(第二十二种)-----策略模式(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学习总结(38)——21条MySql性能优化经验
查看>>
Mysql学习总结(39)——49条MySql语句优化技巧
查看>>
Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
查看>>
Mysql学习总结(40)——MySql之Select用法汇总
查看>>
Mysql学习总结(41)——MySql数据库基本语句再体会
查看>>
Mysql学习总结(42)——MySql常用脚本大全
查看>>
Mysql学习总结(43)——MySQL主从复制详细配置
查看>>
Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
查看>>
Mysql学习总结(45)——Mysql视图和事务
查看>>
Mysql学习总结(46)——8种常被忽视的SQL错误用法
查看>>
Mysql学习总结(48)——MySql的日志与备份还原
查看>>
Mysql学习总结(49)——从开发规范、选型、拆分到减压
查看>>
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
查看>>
Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
查看>>
Mysql学习总结(51)——Linux主机Mysql数据库自动备份
查看>>
Mysql学习总结(52)——最全面的MySQL 索引详解
查看>>
Mysql学习总结(53)——使用MySql开发的Java开发者规范
查看>>
Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
查看>>
Mysql学习总结(55)——MySQL 语句大全再温习
查看>>
Mysql学习总结(56)——MySQL用户管理和权限设置
查看>>