zoukankan      html  css  js  c++  java
  • 策略模式【行为模式】

    策略模式

    策略模式:
    Define a family or algorithms,encapsulate each one,and make them interchangeable.
    定义一组算法,将每个算法都封装起来,并且使得它们可以互换。
    
    @Slf4j
    public class Strategy {
        /**
         * 策略模式:
         * Define a family or algorithms,encapsulate each one,and make them interchangeable.
         * 定义一组算法,将每个算法都封装起来,并且使得它们可以互换。
         */
    
        @Test
        public void testStrategy() {
            final Context context = new Context("hello world");
            final TextStrategy textStrategy = TextStrategy.builder().build();
            final HtmlStrategy htmlStrategy = HtmlStrategy.builder().build();
            final XmlStrategy xmlStrategy = XmlStrategy.builder().build();
            /**
             * 切换策略
             */
            doInvoke(context, textStrategy);
            doInvoke(context, htmlStrategy);
            doInvoke(context, xmlStrategy);
        }
    
        private void doInvoke(Context context, IStrategy textStrategy) {
            context.changeStrategy(textStrategy);
            log.info(context.invoke());
        }
    }
    
    /**
     * 1)定义所有策略的核心接口
     */
    interface IStrategy {
        String execute(String t);
    }
    /**
     * 2)定义具体的策略实现
     */
    @Builder
    class TextStrategy implements IStrategy {
        @Override
        public String execute(String t) {
            return t;
        }
    
    }
    @Builder
    class HtmlStrategy implements IStrategy {
    
        @Override
        public String execute(String t) {
            return "<html><head><title>Empty</title></head><h3>#<h3></body></html>".replace("#", t);
        }
    
    }
    @Builder
    class XmlStrategy implements IStrategy {
    
        @Override
        public String execute(String t) {
            return "<?xml version="1.0" encoding="UTF-8"?><target>#</target>".replace("#", t);
        }
    
    }
    
    /**
     * 3)定义一个上下文,用于切换策略
     */
    @Builder
    @AllArgsConstructor
    class Context {
        private IStrategy strategy;
        private final String target;
    
        public Context(String target) {
            super();
            this.target = target;
        }
    
        public void changeStrategy(IStrategy strategy) {
            this.strategy = strategy;
        }
    
        public String invoke() {
            return strategy.execute(target);
        }
    }
    
  • 相关阅读:
    【TS】535- 7个超好用的 TypeScript 新功能
    【学习】一起加入重学 TypeScript 学习小组
    17.5W秒级交易峰值下的混合云弹性架构之路
    微服务架构:spring cloud之服务注册和服务发现
    消息队列服务RabbitMQ 和Kafka对比
    微服务架构:spring cloud简介
    2016 年度码云热门项目排行榜 TOP 10
    Netflix Conductor : 一个微服务的编排器
    Java 9的这一基本功能,你可能从未听过
    使用 Docker 搭建 Java Web 运行环境
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10164720.html
Copyright © 2011-2022 走看看