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

      《Head First 设计模式》学习中

     设计原则

    • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
    • 针对接口编程,而不是针对实现编程
    • 多用组合少用继承

     策略模式

    • 定义算法族,分别封装起来,让他们可以互相替换,此模式让计算的变化独立于使用算法客户

    这个模式涉及到三个角色:

      ●  环境(Context)角色:持有一个Strategy的引用。

      ●  抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

      ●  具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

    书中的例子是鸭子,感觉怪怪的, 换个说法、

    最近楼下开了一个凤凰门火锅店,路口发的传单都是他们店内的,拿它举下例子吧。

    抽象策略类

    package com.strategy;
    /**
     * 抽象策略类  接口
     * @author Administrator
     *
     */
    public interface Price {
    	/**
    	 * 策略方法  计算金额
    	 * @param money  RMB
    	 */
         void calcPrice (double money);
    }

     具体策略类

    package com.strategy;
    
    public class sevenDay implements Price{
    
    	@Override
    	public void calcPrice(double money) {
    		System.out.println("开业7天五折!!");
    		System.out.println("您的消费为" + money * 0.5 + "RMB");
    	}
    	
    }
    
    package com.strategy;
    
    public class FifteenDay implements Price {
    
    	@Override
    	public void calcPrice(double money) {
    		System.out.println("开业15天7.8折");
    		System.out.println("您的消费为" + money * 0.78 + "RMB");
    	}
    
    }
    
    package com.strategy;
    
    public class ThirtyDay implements Price {
    
    	@Override
    	public void calcPrice(double money) {
    		System.out.println("优惠时间已过!");
    		System.out.println("您的消费为" + money  + "RMB");
    	}
    
    }
    

    环境角色类

    package com.strategy;
    /**
     * 环境角色类
     * @author Administrator
     *
     */
    public class Strategy {
    	//具体策略的对象
    	private Price price ;
    	
    	//构造方法,传入一个策略对象
    	public Strategy(Price price){
    		this.price = price;
    	}
    	
    	//策略方法
    	public void show(double money){
    		this.price.calcPrice(money);
    	}
    }  

    测试类

    package com.strategy;
    
    public class TestPrice {
        public static void main(String[] args) {
            
            //选择并创建需要使用的策略对象  
            Price price = new sevenDay();
            //创建环境
            Strategy strategy = new Strategy(price);
            //调用方法计算价格
            strategy.show(324);
            
            //选择并创建需要使用的策略对象
            Price price1 = new FifteenDay();
            //创建环境
            Strategy strategy1 = new Strategy(price1);
            //调用方法计算价格
            strategy1.show(276);
            
            //选择并创建需要使用的策略对象
            Price price2 = new ThirtyDay();
            //创建环境
            Strategy strategy2 = new Strategy(price2);
            //调用方法计算价格
            strategy2.show(0);
        }
    }

     计算结果

    开业7天五折!!
    您的消费为162.0RMB
    开业15天7.8折
    您的消费为215.28RMB
    优惠时间已过!
    您的消费为0.0RMB

    策略模式的优点

      (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

      (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

    策略模式的缺点

      (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

      (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

     

    参考引用博客为  http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html  侵权必删

  • 相关阅读:
    **没有规则可以创建“XXX”需要的目标“XXX”问题的解决方案
    牛逼博主
    tiny4412 busybox制作根文件系统rootfs nfs 挂载 ubuntu 14.04
    解决 mounting /dev/block/mmcblk0p1 on /sdcard failed
    如何在虚拟机上配置hadoop集群
    数据结构线性表
    a伪类,关于图片
    脱离标准文档流(2)---定位
    脱离标准文档流(1)---浮动
    初窥css---盒子以及盒子扩展
  • 原文地址:https://www.cnblogs.com/chenlizhi/p/7801357.html
Copyright © 2011-2022 走看看