一个策略模式Demo
  HwStpnXEg1k1 2023年11月02日 44 0


主要解决一个什么问题

比如有个方法

public void sayHello(String type){
    if (type.equals("xiaoji")) {
        System.out.println("小鸡叫");
    }else if (type.equals("yazi")) {
        System.out.println("鸭子叫");
    }
}

这个代码有什么问题?如果后面要再加一个猪叫,是不是又要加一个if,这样不利于扩展

策略模式

一个接口,策略模式一般定义2个方法,一个用于批评类型,一个是具体的实现方法

public interface AnimalService {

    void sayHello();

    String getType();
}

小鸡实现类

@Service
public class XiaojiServiceImpl implements AnimalService {
    @Override
    public void sayHello() {
        System.out.println("小鸡叫");
    }

    @Override
    public String getType() {
        return "xiaoji";
    }
}

鸭子实现类

@Service
public class YaziServiceImpl implements AnimalService {
    @Override
    public void sayHello() {
        System.out.println("鸭子叫");
    }

    @Override
    public String getType() {
        return "yazi";
    }
}

策略方法类

@Component
public class AnimalStrategyServiceFactory implements ApplicationContextAware {

    private Map<String, AnimalService> map = new ConcurrentHashMap<>();
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        applicationContext.getBeansOfType(AnimalService.class).values().forEach(animal -> map.put(animal.getType(), animal));
    }

    public void sayHello(AnimalService animal){
        map.get(animal.getType()).sayHello();
    }

    public void sayHello(String type){
        if (type.equals("xiaoji")) {
            System.out.println("小鸡叫");
        }else if (type.equals("yazi")) {
            System.out.println("鸭子叫");
        }
    }
}

测试

@Test
void test() {
    AnimalService animal = new YaziServiceImpl();
    animalStrategyServiceFactory.sayHello(animal);
}

这种代码的好处是,如果以后要加个猪实现,是不需要修改代码的,即对修改关闭,对扩展开放。即开闭原则


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  A32uB2Hhmc6N   2023年12月12日   51   0   0 MySQLMySQLideide
  zT6CXotonQAP   2023年12月05日   33   0   0 SystemSystem
HwStpnXEg1k1