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

你可能感兴趣的文章
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>