zoukankan      html  css  js  c++  java
  • 第九讲:策略模式

    Strategy:算法的抽象,比如说加密算法.

    ConcreteStrategy:算法的具体实现,比如说MD5加密,或者是MDS加密.

    Context是由外部环境决定的,意思是Context是由客户决定的.

    //Context持有策略Strategy的引用.....
    //你具体要的是哪一个当你调用Context的operation()方法的时候它就给你执行哪一个
    //策略模式和装饰模式有点像,同样都是包含对象的引用.
    //但是装饰模式是持有引用的类同样实现了接口,但是策略模式里面Context肯定不会去实现Strategy接口.
    public class Context {
        
         private  Strategy strategy;
    
        public Context(Strategy strategy) {
            super();
            this.strategy = strategy;
        }
         public void encrypt(){
             this.strategy.encrypt();//由具体子类来调用加密....
         }
    }
    public class MainClass {
        public static void main(String[] args) {
    /*        Strategy stra   =  new MD5Strategy();//这样就可以实现动态的改变,在客户端改变就可以了.
            //但是这不符合策略模式,策略模式还有一个核心是Context.Context可以看做是工厂,里面包含了Strategy的引用.
            
            stra.encrypt();*/
        
        Context context = new Context(new MD5Strategy());
        context.encrypt();//这里的好处在于是通过Context进行封装的...
        //通过调用encrypt这个方法来执行...
        //客户人员他所关心的是这个Context.而你实际上用的是MD5Strategy
        
        
        
        
        
        }
    }
    //策略的具体的实现
    public class MD5Strategy implements Strategy{
    
        @Override
        public void encrypt() {
            System.out.println("执行MD5加密");
            
        }
         
    }
    public class MDSStrategy implements Strategy{
    
        @Override
        public void encrypt() {
           System.out.println("执行MDS加密");
            
        }
    
    }
    //策略抽象类,抽象的接口
    public interface Strategy {
           
        //加密
        public void encrypt();
    }

    再做一个例子,商家要促销,打八折,或者是满一百送二十,满两百送多少...

    package com.ibeifeng.strategy;
    //Context是对你的策略的具体的选择
    //策略模式对不同的算法/策略是非常好用的.
    public class Context {
        private Strategy strategy;//持有策略的引用.
    
        public Context(Strategy strategy) {
            super();
            this.strategy = strategy;
        }
    
        public double cost(double num){
            return this.strategy.cost(num);
        }
    }
    package com.ibeifeng.strategy;
    
    public class MainClass {
        public static void main(String[] args) {
            double num = 200;
            //Context context = new Context(new StrategyA());
            Context context = new Context(new StrategyB());
            //策略模式可以搭配工厂模式,判读选择是new一个对象.工厂模式对于对象的生成是非常方便的.
            //策略模式与工厂模式进行综合的应用
            double newNum = context.cost(num);
            System.out.println("实际付账" +newNum + "元");
            
        }
    }
    package com.ibeifeng.strategy;
    //如果再增加一个策略,只要实现了Strategy接口然后再重写cost方法即可.
    public interface Strategy {
         
        public double cost(double num);
        
        
        
    }
    package com.ibeifeng.strategy;
    //打八折
    public class StrategyA implements Strategy{
    
        @Override
        public double cost(double num) {
            return num * 0.8;
            
        }
        
    }
    package com.ibeifeng.strategy;
    //满两百返还五十
    public class StrategyB implements Strategy {
    
        @Override
        public double cost(double num) {
            if(num >= 200){
                return num-50;
            }
            return num;
        }
    
    }

    两种算法的公共部分可以抽取出来.

    几个对象它的数据是相同的可以把它共享一下.

    策略模式比装饰模式简单多了.装饰模式涉及到给对象添加使用类,策略模式只是持有对象的引用,然后实现你具体的方法.

  • 相关阅读:
    【转】Odoo开发之:工作流 workflow
    【转】Odoo:基本字段类型
    【转】odoo 10的企业微信发送程序介绍
    Installing python-ldap in Ubuntu
    Odoo8中安装新模块找不到的问题
    mybatis缓存
    ThreadPoolExecutor线程池进阶使用
    使用Dubbo实现RPC调用
    java静态代理模式
    java四种线程池
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6736815.html
Copyright © 2011-2022 走看看