zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

    策略模式(Strategy) 是常用的一种设计模式,顾名思义,可以简单的理解为可以灵活的选择一种谋略(算法)达到某种目的。策略模式共有四个角色,分别为:Context上下文角色、抽象策略角色、具体策略角色、Client客户端,下文将详细介绍他们之家的关系

    角色关系

    代码实现

    interface car {
        public int useTime();
    }
    
    class Bicycle implements car {
        String str = "运动,慢";
    
        public int useTime(start_site, end_site) {
            System.out.println(str);
            return 40;
        }
    }
    
    class Electrocar implements car {
        String str = "悠闲,快";
    
        public int useTime(start_site, end_site {
            System.out.println(str);
            return 25;
        }
    }
    
    class Automobile implements car {
        String str = "舒适,堵车";
    
        public int useTime(start_site, end_site) {
            System.out.println(str);
            return 30;
        }
    }
    
    class Context {
        private Car car;
    
        public void Context(Car car) {
            this.car = car;
        }
        public int getUseTime() {
            return car.useTime;
        }
    }
    
    class Client {
        public static void main(String[] args) {
            String start_site = "始发站";
            String end_site = "终点站";
    
            Context context = new Context(new Bicycle());
            return context.getUseTime(start_site, end_site);
        }
    }
    
    

    优缺点

    优点

    • 策略模式符合开闭原则
    • 避免使用条件判断语句
    • 使用策略模式,可以减少暴露类的其他功能,安全性好

    缺点

    • 客户端需要知道所有类,并实现该类(一般配合工厂模式使用)
    • 会增加很多策略类

    对比其他设计模式

    学过工厂模式的应该会有一个疑问,为什么不用工厂模式,用策略模式还要再使用工厂模式,以下我们对比一下和策略模式相似的模式的共同点和不同点

    对比简单工厂模式

    相同点

    • 结构很相似

    不同点

    • 传入参数不同,简单工厂模式,传递的更倾向于类型(不知道返回的是什么类),策略模式传递的是已知的实例
    • 返回值不同,简单工厂模式返回的是实例,策略模式返回的是指定的方法
    • 工厂是创建型模式,它的作用就是创建对象。策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为

    对比静态代理模式

    相同点

    • 结构很相似,包括传递的参数类型
      不同点
    • 静态代理模式知道结果,比如找中介买房子,知道会买什么样的房子,及会买到房子。策略是计算结果,不知道内部如何处理
    • 静态代理模式,代理类和被代理类继承一个接口,实现同样的方法,策略类不同

    个人能力有限,有不足的地方欢迎大家补充

  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/it-abel/p/14469608.html
Copyright © 2011-2022 走看看