zoukankan      html  css  js  c++  java
  • 设计模式笔记(二):策略模式

    应用场景:

    1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

    2、一个系统需要动态地在几种算法中选择一种。

    3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

    实现步骤:

    以人吃饭的方式不同来举例。

    1、定义一个接口,接口中定义行为方法;

    public interface EatStrategy {
        void eat();//吃饭策略
    }

    2、定义多个需要实现该行为方法的实现类;

    单身狗,只能一个人吃饭

    public class SingleEat implements EatStrategy {
        @Override
        public void eat() {
            System.out.println("一个人吃");
        }
    }

    有对象的人,两个人吃饭

    public class DoubleEat implements EatStrategy {
        @Override
        public void eat() {
            System.out.println("两个人吃");
        }
    }

    3、定义容器类(Person),组合行为方法的实现类(EatStrategy),需要时调用实现类的方法即可。

    张三现在20岁,职业程序员,平时工作太忙,来不及找对象,所以吃饭只能采用单身狗方式:

    public class Person {
    
        private EatStrategy eatStrategy;
    
        public Person(EatStrategy eatStrategy){
            this.eatStrategy = eatStrategy;//构造方法设置吃饭实例
        }
    
        public void setEatStrategy(EatStrategy eatStrategy) {
            this.eatStrategy = eatStrategy;//setter方法设置吃饭实例
        }
    
        public void eat(){
            eatStrategy.eat();//使用吃饭实例吃饭
        }
    
        public static void main(String[] args) {
            Person person = new Person(new SingleEat());
            person.eat();
        }
    }

    10年过去了,张三当上了公司研发总监,陆续买房买车,找女友更是不在话下。现在张三吃饭变为两个人吃了:

    public class Person {
    
        private EatStrategy eatStrategy;
    
        public Person(EatStrategy eatStrategy) {
            this.eatStrategy = eatStrategy;
        }
    
        public void setEatStrategy(EatStrategy eatStrategy) {
            this.eatStrategy = eatStrategy;
        }
    
        public void eat() {
            eatStrategy.eat();
        }
    
        public static void main(String[] args) {
            Person person = new Person(new SingleEat());
            person.eat();
            //ten years later
            person.setEatStrategy(new DoubleEat());//调用setter方法,切换吃饭策略
            person.eat();
        }
    }

  • 相关阅读:
    Token 分析
    maven导入依赖下载jar包速度太慢
    springboot 自动装配
    @ComponentScan
    mysql8.0忘记密码或出现Access denied for user 'root'@'localhost' (using password: YES)
    SpringBoot静态资源处理
    @RestController
    PythonGUI:Tkinter学习笔记01
    Python2和Python3有什么区别?
    Python的Random模块
  • 原文地址:https://www.cnblogs.com/yjry-th/p/15131630.html
Copyright © 2011-2022 走看看