设计模式之策略模式

策略模式

定义: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it

定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

策略模式被广泛使用
(1)如redis淘汰策略,ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰,lru从已设置过期时间的数据集中挑选最近最少使用的数据淘汰,可以通过策略模式动态设置淘汰算法。
(2)如文件排序,根据文件大小,使用文件排序,内部并发文件排序,或者mapreduce排序。
既可以使得代码低耦合高内聚,又可以减少代码的if…else冗杂分支。

完整的策略模式应该包括策略的定义、策略的创建和策略的使用
代码演示1 缓存淘汰,使用不同算法指定缓存淘汰策略
策略定义
public interface EvictionStrategy {
    void evict();
}
策略创建
public class ConcreteEvictionStrategyA implements EvictionStrategy {
    @Override
    public void evict() {

    }
}

public class ConcreteEvictionStrategyB implements EvictionStrategy {
    @Override
    public void evict() {
        
    }
}

public class EvictionStrategyFactory {
    private static final Map<String, EvictionStrategy> strategies = new HashMap<>();

    static {
        strategies.put("A", new ConcreteEvictionStrategyA());
        strategies.put("B", new ConcreteEvictionStrategyB());
    }

    public static EvictionStrategy getStrategy(String type) {
        if (type == null || type.isEmpty()) {
            throw new IllegalArgumentException("type should not be empty");
        }
        return strategies.get(type);
    }
}
策略使用
public class UserCache {
    private Map<String, User> cacheData = new HashMap<>();
    private EvictionStrategy evictionStrategy;

    public UserCache(EvictionStrategy evictionStrategy) {
        this.evictionStrategy = evictionStrategy;
    }
}

public class Application {
    public static void main(String[] args) throws IOException {
        EvictionStrategy evictionStrategy = null;
        Properties properties = new Properties();
        properties.load(new FileInputStream("./config.properties"));
        String type = properties.getProperty("eviction_type");
        evictionStrategy = EvictionStrategyFactory.getStrategy(type);

        //运行时动态确定,根据配置文件的配置决定使用哪种策略
        UserCache userCache = new UserCache(evictionStrategy);

    }
}
代码演示2 文件内容排序,按照文件大小,选择不同策略排序
策略定义
public interface ISortAlg {
    void sort(String filePath);
}
策略创建
public class QuickSort implements ISortAlg {
    @Override
    public void sort(String filePath) {

    }
}

public class ExternalSort implements ISortAlg {
    @Override
    public void sort(String filePath) {

    }
}

public class ConcurrentExternalSort implements ISortAlg {
    @Override
    public void sort(String filePath) {

    }
}

public class MapReduceSort implements ISortAlg {
    @Override
    public void sort(String filePath) {

    }
}

public class SortAlgFactory {
    private static final Map<String, ISortAlg> sortAlgs = new HashMap<>();

    static {
        sortAlgs.put("QuickSort", (ISortAlg) new QuickSort());
        sortAlgs.put("ExternalSort", (ISortAlg) new ExternalSort());
        sortAlgs.put("ConcurrentExternalSort", (ISortAlg) new ConcurrentExternalSort());
        sortAlgs.put("MapReduceSort", (ISortAlg) new MapReduceSort());
    }

    public static ISortAlg getSortAlg(String type) {
        if (type == null || type.isEmpty()) {
            throw new IllegalArgumentException("type should not be empty");
        }
        return sortAlgs.get(type);
    }
}
策略使用



public class Sorter {
    private static final long GB = 1000 * 1000 * 1000;
    private static final List<AlgRange> algs = new ArrayList<>();

    static {
        algs.add(new AlgRange(0, 6*GB, SortAlgFactory.getSortAlg("QuickSort")));
        algs.add(new AlgRange(6*GB, 10*GB, SortAlgFactory.getSortAlg("ExternalSort")));
        algs.add(new AlgRange(10*GB, 100*GB, SortAlgFactory.getSortAlg("ConcurrentExternalSort")));
        algs.add(new AlgRange(100*GB, Long.MAX_VALUE, SortAlgFactory.getSortAlg("MapReduceSort")));
    }

    public void sortFile(String filePath) {
        // 省略校验逻辑
        File file = new File(filePath);
        long fileSize = file.length();
        ISortAlg sortAlg = null;
        for (AlgRange algRange : algs) {
            if (algRange.inRange(fileSize)) {
                sortAlg = algRange.getAlg();
                break;
            }
        }

        sortAlg.sort(filePath);
    }

    private static class AlgRange {
        private long start;
        private long end;
        private ISortAlg alg;
        public AlgRange(long start, long end, ISortAlg alg) {
            this.start = start;
            this.end = end;
            this.alg = alg;
        }
        public ISortAlg getAlg() {
            return alg;
        }

        public boolean inRange(long size) {
            return size >= start && size < end;
        }
    }
}

代码参考: https://github.com/hero-joey/java-study-examples/tree/master/designpatten/src/com/hero/designpatten

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3
策略模式是一种设计模式,它在JavaScript中有着广泛的应用。策略模式的主要思想是将不同的算法封装成不同的策略类,并让这些策略类能够互相替换,以实现不同的行为。在JavaScript中,策略类就是一组函数,它们可以根据不同的情况来执行不同的算法。 策略模式在JavaScript中有很多实际运用,其中两个主要的应用场景是实现动画效果和表单验证。通过使用策略模式,我们可以轻松地切换不同的动画效果,同时可以根据不同的验证规则来验证表单数据的有效性。 在实际的开发过程中,策略模式的应用可能会受到需求的限制,因此在一些情况下这类需求较少。然而,理解策略模式的实现原理是非常重要的,包括封装、委托、多态等概念在策略模式中的应用。这些概念是策略模式的核心。 总结来说,策略模式是一种在JavaScript中广泛应用的设计模式,它通过将算法封装成不同的策略类,实现了行为的灵活替换。在实际应用中,策略模式可以用于实现动画效果和表单验证等功能。理解策略模式的核心概念对于深入理解JavaScript中的设计模式是非常重要的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [05 【JavaScript设计模式策略模式](https://blog.csdn.net/qq_35117024/article/details/106396011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [js设计模式策略模式](https://blog.csdn.net/SK_study/article/details/122404194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值