【设计模式--->行为型模式】叩心自问:策略模式

什么是策略模式?

sadasd策略模式(Strategy Pattern)中,定义算法族,分别封装起来行为接口, 让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

sadasd这算法体现了几个设计原则 :

sadassdsdd第一、把变化的代码从不变的代码中分离出来

sadssddasd第二、针对接口编程 而不是具体类(定义了策略接口);

sadsdddasd第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。

sada dUML图如下:
sadsdsddsdsdsdsa 在这里插入图片描述
sada d【注】:客户context 有成员变量strategy或者其他的策略接口,至于需要使用到哪个策略,我们可以在构造器中指定。


鸭子问题

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

sada dUML图如下:
sasdsdsdddddda 在这里插入图片描述
sadasd鸭子抽象类Duck代码实现 :

public abstract class Duck {
    public Duck(){}
    public abstract void display(); //显示鸭子信息
    public  void quack(){
        System.out.println("鸭子嘎嘎叫");
    }
    public  void swim(){
        System.out.println("鸭子会游泳");
    }
    public void fly(){
        System.out.println("鸭子会飞翔");
    }
}

sadasd北京鸭代码 :

public class PekingDuck extends Duck {
    @Override
    public void display() {
        System.out.println("北京鸭");
    }

    //因为北京鸭不会飞,因此需要重写fly
    @Override
    public void fly() {
        System.out.println("北京鸭不能飞翔");
    }
}

sadasd玩具鸭代码:

public class ToyDuck extends Duck {
    @Override
    public void display() {
        System.out.println("玩具鸭");
    }
    //需要重写父类所有方法
    public  void quack(){
        System.out.println("鸭子不会嘎嘎叫");
    }
    public  void swim(){
        System.out.println("鸭子不会游泳");
    }
    public void fly(){
        System.out.println("鸭子不会飞翔");
    }
}

sadasd缺点:所有鸭子都继承了抽象类Duck,单并不是所有的鸭子都会飞,因此需要通过覆盖fly方法来解决这个问题,这其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应。我们可以通过策略模式来考虑这个问题。

sada d改进的UML图如下:
sadsda 在这里插入图片描述
sadasd我们只写fly()一个行为进行策略:

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

sadasd重写Duck方法:

public abstract class Duck {
    //属性,策略接口
    FlyBehavior flyBehavior;

    public  Duck(){}

    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;
    }
}

sadasdDuck子类:

public class ToyDuck extends Duck {

    public ToyDuck(){
        flyBehavior = new NoFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("玩具鸭");
    }

    public  void quack(){
        System.out.println("玩具鸭不能叫");
    }

    public  void swim(){
        System.out.println("玩具鸭不会游泳");
    }
}

public class WildDuck extends Duck {

    public WildDuck(){
        flyBehavior = new GoodFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("这是野鸭");
    }

    public  void quack(){
        System.out.println("野鸭能叫");
    }

    public  void swim(){
        System.out.println("野鸭会游泳");
    }
}

sadasd测试及结果:

public class Client {
    public static void main(String[] args) {
        ToyDuck toyDuck = new ToyDuck();
        toyDuck.fly();

        WildDuck wildDuck = new WildDuck();
        wildDuck.fly();
    }
}
----------------------------------------------------------------------------------------------------
不会飞翔
飞翔技术高超

策略模式在JDK-Arrays 的应用

sadasd有各种鸭
在这里插入图片描述


策略模式的注意事项和细节

在这里插入图片描述

### AnyGo 连接失败解决方案 当遇到 AnyGo 连接失败的情况时,可能是由于多种原因引起的,包括设备配置错误、权限未授予或软件兼容性问题。以下是针对该问题的具体分析和解决方法: #### 设备连接设置 确保 iPhone 或 iPad 已正确连接至 Mac 并启用了调试模式。按照以下步骤操作可有效解决问题[^3]: - 确认 iPhone 或 iPad 使用数据线已成功连接到 Mac 上。 - 启动 AnyGo 软件并选择对应的 iOS 版本。 - 在弹窗提示下开启手机的开发者选项以及 USB 调试模式。 #### 权限与信任设置 如果连接仍然无法完成,则可能是因为设备间缺乏必要的信任关系。需注意以下几点: - 输入电脑请求的管理员密码以授权访问。 - 手机端确认“信任此计算机”的对话框。 - 保持手机屏幕解锁状态以便维持稳定通信链路。 #### 软件版本匹配 考虑到不同硬件平台间的差异,务必验证所使用的 AnyGo 是否适配当前操作系统环境及其架构特性(如 Apple M1/M2 处理器)。最新版通常具备更好的稳定性和支持范围[^4]: - 下载适用于 macOS 的官方正式发行包文件。 - 安装过程中遵循向导指示直至结束。 #### 地图服务异常排查 有时即使完成了上述准备工作仍会遭遇网络层面干扰而导致定位更新失败。此时建议尝试下面这些措施来改善状况: - 刷新应用内部的地图缓存资源。 - 更改目标坐标后再重新发送指令让装置逐步接近最终目的地。 ```python import time def simulate_gps_move(start_lat, start_lng, end_lat, end_lng): current_latitude = start_lat current_longitude = start_lng while (current_latitude != end_lat or current_longitude != end_lng): # 更新当前位置逻辑省略... print(f"Current Position: {current_latitude}, {current_longitude}") time.sleep(1) simulate_gps_move(37.7749, -122.4194, 40.7128, -74.0060) ``` 以上脚本仅作演示用途展示如何模拟连续地理坐标的变更过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值