简述设计模式之策略模式

本文介绍了策略模式在代码设计中的应用,通过一个示例展示了如何使用策略模式来避免对原有类的侵入式修改,提高代码的灵活性和可扩展性。策略模式允许将行为封装在独立的策略类中,使得增加或修改技能变得简单,但可能导致策略类的数量增多。通过重构BeforeFriend类为Friend类,并引入SkillManager接口和具体策略类DriveSkill、ReadSkill,实现了技能的动态加载和切换。
摘要由CSDN通过智能技术生成

什么是策略模式

现在有一个朋友如下,会阅读、驾驶,如果想要增加或修改原来会的技能,就必须要去操作你的朋友,可能会导致的结果是朋友会被改的臃肿且面目全非

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BeforeFriend {

    private String name;
    
    private int age;
    
    public void drive(){
        System.out.println("drive");
    }

    public void read(){
        System.out.println("read");
    }
}

而策略模式在这个场景下就是瘦身神器,只需要朋友掌握技能管理器,让技能管理器加载技能即插即用,缺点就是技能可能会随着时间越来越多

重新定义朋友如下,让其掌握技能管理器

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Friend {

    private String name;
    
    private int age;
    
    private SkillManager skillManager;

    public void getSkill(){
        this.skillManager.getSkill();
    }
}

创建技能管理器如下

public interface SkillManager {

    void getSkill();

}

实现具体的技能

public class DriveSkill implements SkillManager {

    @Override
    public void getSkill() {
        System.out.println("drive");
    }

}

public class ReadSkill implements SkillManager {

    @Override
    public void getSkill() {
        System.out.println("read");
    }

}

当完成以上三步后,我们的朋友就变成了

public static void main(String[] args) {
    
	Friend friend = new Friend();
    
    DriveSkill drive = new DriveSkill();
    //加载驾驶技能
    friend.setSkillManager(drive);
    friend.getSkill();
    
    ReadSkill read = new ReadSkill();
    //加载阅读技能
    friend.setSkillManager(read);
    friend.getSkill();
}

可以明显看出,如果想在BeforeFriend中新增或修改技能,就需要对BeforeFriend进行侵入式修改,而在Friend中增加实现SkillManager接口的类即可,就实现了对Friend的无侵入式增强,更灵活且更具拓展性

换成专业术语描述,将类(Context)中公共且可能经常修改的内容提取抽象为策略接口(Strategy),类持有策略接口实例,基于多态在类的实例中即可调用实现了策略接口的具体策略类(ConcreteStrategy),缺点是具体策略类会随着业务的拓展和时间的推移越来越多

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值