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

    思维导图:

    我们先来看 STRATEGY 设计模式的通俗解释:

    跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心,我的追 MM 锦囊中有好多 Strategy 哦。
    策略模式:

    策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

    策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端

    例1:

    首先定义一个接口,这个接口是诸葛亮给赵云三个妙计的接口。

    1、将公共的部分抽象为接口;

    下面这个接口是算法类的公共接口。

    package com.liwei.strategy;
    /**
     * 首先定义一个接口,这个接口是诸葛亮给赵云三个妙计的接口
     * @author Administrator
     *
     */
    public interface IStrategy {
        /**
         * 每个妙计都是一个可以执行的算法
         */
        public void operate();
    }

    2、写好三个实现类

    package com.liwei.strategy.impl;
    
    import com.liwei.strategy.IStrategy;
    /**
     * 妙计实现类之一
     * @author Administrator
     *
     */
    public class BackDoor implements IStrategy {
        @Override
        public void operate() {
            System.out.println("找乔国老开后门,让吴国太给孙权施加压力,使孙权不能杀刘备。");
        }
    
    }
    package com.liwei.strategy.impl;
    
    import com.liwei.strategy.IStrategy;
    
    /**
     * 妙计实现类之一
     * 
     * @author Administrator
     * 
     */
    public class BlackEnemy implements IStrategy {
        @Override
        public void operate() {
            System.out.println("孙夫人出面,挡住追兵。");
        }
    
    }
    package com.liwei.strategy.impl;
    
    import com.liwei.strategy.IStrategy;
    /**
     * 妙计实现类之一
     * @author Administrator
     *
     */
    public class GivenGreenLight implements IStrategy {
        @Override
        public void operate() {
            System.out.println("求吴国太开个绿灯,甘露寺解围!");
        }
        
    }

    3、把实现类放在一个环境里(无须实现接口、可以认为是对外提供一个方法)

    package com.liwei.strategy;
    /**
     * 这是锦囊,存放妙计的地方
     * @author Administrator
     *
     */
    public class Context {
        private IStrategy strategy;
    
        /**
         * 使用构造函数注入,指明你要使用哪一条妙计
         * @param strategy
         */
        public Context(IStrategy strategy) {
            this.strategy = strategy;
        }
        
        /**
         * 这是锦囊的方法,由锦囊产生妙计,而妙计由注入的妙计接口来决定
         */
        public void oper(){
            /**
             * 这个时候,真正传进来的妙计要真正出马了
             */
            this.strategy.operate();
        }
    }

    4、编写测试类

    package com.liwei.strategy;
    
    import com.liwei.strategy.impl.BackDoor;
    import com.liwei.strategy.impl.BlackEnemy;
    import com.liwei.strategy.impl.GivenGreenLight;
    
    public class Test {
        /**
         * 这里要注意:是锦囊执行了操作
         * @param args
         */
        public static void main(String[] args) {
            Context context;
            // 刚到吴国的时候拆开第 1 个
            System.out.println("------刚到吴国的时候拆开第 1 个锦囊了------");
            context = new Context(new BackDoor());
            context.oper();
            System.out.println("
    
    ");
            System.out.println("------这时刘备乐不思蜀,开始拆第 2 个锦囊了------");
            context = new Context(new GivenGreenLight());
            context.oper();
            System.out.println("
    
    ");
            System.out.println("------孙权追兵到了,开始拆第 3 个锦囊了------");
            context = new Context(new BlackEnemy());
            context.oper();
        }
    }

    例2:

    1、定义一个算法类的公共接口;

    这个接口只是定义了计算,如何计算?两个操作数是加、减、乘、除?

    package com.shejimoshi.celue;
    
    public interface Strategy {
        public int calculate(int a,int b);
    }

    2、实现算法接口的类;

    package com.shejimoshi.celue;
    
    public class AddStrategy implements Strategy {
    
        @Override
        public int calculate(int a, int b) {
            return a + b;
        }
    
    }
    package com.shejimoshi.celue;
    
    public class SubtractStrategy implements Strategy {
    
        @Override
        public int calculate(int a, int b) {
            return a - b;
        }
    
    }
    package com.shejimoshi.celue;
    
    public class MulStrategy implements Strategy {
    
        @Override
        public int calculate(int a, int b) {
            return a * b;
        }
    
    }

    3、定义一个环境类;

    package com.shejimoshi.celue;
    
    public class Environment {
        private Strategy strategy;
    
        public Environment(Strategy strategy) {
            super();
            this.strategy = strategy;
        }
    
        public Strategy getStrategy() {
            return strategy;
        }
    
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
    
        public int calculate(int a, int b) {
            return this.strategy.calculate(a, b);
        }
    }

    4、由环境类执行操作。

    package com.shejimoshi.celue;
    
    public class Client {
        public static void main(String[] args) {
            /**
             * 理解策略设计模式要注意留意 Java 中多态的概念
             */
            AddStrategy addStrategy = new AddStrategy();
            Environment environment = new Environment(addStrategy);
            System.out.println(environment.calculate(4, 3));
    
            // 减法
            SubtractStrategy subStrategy = new SubtractStrategy();
            environment.setStrategy(subStrategy);
            System.out.println(environment.calculate(4, 3));
    
            // 乘法
            MulStrategy multiplyStrategy = new MulStrategy();
            environment.setStrategy(multiplyStrategy);
            System.out.println(environment.calculate(4, 3));
        }
    }
  • 相关阅读:
    点击按钮倒计时
    js实现-小框框全选
    CSS文字,文本,背景,盒模型等记录
    xps9560黑苹果展示
    面试——谈谈你对抽象和接口的理解(小知识大考点)
    谈谈你对Java 面向对象思想的理解
    谈谈你对Java 平台的理解
    HashMap1.7 问题总结
    2.3.2 InnoDB内存
    2.3 InnoDB 体系架构
  • 原文地址:https://www.cnblogs.com/liweiwei1419/p/4472552.html
Copyright © 2011-2022 走看看