您的位置:首页 > 编程语言 > Go语言

GOF23设计模式之策略模式与实现

2015-04-15 20:26 731 查看

策略模式strategy
    场景:
        某个市场人员接到单后的报价策略。报价策略很负责,可以简单做如下分类:
普通客户小批量
普通客户大批量
老客户小批量
老客户大批量
具体选用那个报价策略,需要根据实际情况来定,这时候,我们采用策略模式即可。
 
本质:
    分离算法,选择实现。
开发中常见的场景:
    JAVASE中GUI编程中,布局管理
    Spring框架中,Resource接口中,资源访问策略
==============================================
/**
 * 传统实现方式
 * 做起来比较容易,符合一般开发人员的思路。
 * 假如类型特别多,算法比较复杂整个条件语句的代码变得很长,难于维护
 * 如果有新增类型,就需要频繁的修改这段代码,不符合开闭原则。
 *
 */
package com.bjsxt.cn.strategy;
public class TestStrategy {
 public double getPrice(String type, double price) {
  if (type.equals("新客户小批量")) {
   System.out.println("不打折,原价");
   return price;
  } else if (type.equals("新客户大批量")) {
   System.out.println("打九折");
   return price*0.9;
  } else if (type.equals("老客户小批量")){
   System.out.println("打八折");
   return price*0.8;
  } else if (type.equals("老客户大批量")) {
   System.out.println("打七折");
   return price * 0.7;
  }
  return price;
  
 }
}
  =========================================
/**
 * 抽象策略接口
 */
package com.bjsxt.cn.strategy;
public interface Strategy {
 public double getPrice(double oldPrice);
}
===========================================
/**
 * 2015年4月15日09:45:41
 * 处理的是新客户小批量
 */
package com.bjsxt.cn.strategy;
public class NewCustomerFew implements Strategy {
 @Override
 public double getPrice(double oldPrice) {
  System.out.println("新客户小批量,不打折");
  return oldPrice;
 }
 
}
============================================
/**
 * 2015年4月15日09:47:32
 * 新客户大批量,九折
 */
package com.bjsxt.cn.strategy;
public class NewCustomerLarge implements Strategy {
 @Override
 public double getPrice(double oldPrice) {
  System.out.println("新客户大批量,九折");
  return oldPrice * 0.9;
 }
}
==============================================
/**
 * 一种打折策略,老客户小批量, 七折
 * 2015年4月15日09:49:12
 */
package com.bjsxt.cn.strategy;
public class OldCustomerFew implements Strategy {
 @Override public double getPrice(double oldPrice) {  System.out.println("老客户小批量, 七折");  return oldPrice * 0.7; } }
=================================================
/**
 * 老客户大批量,七折
 * 2015年4月15日09:51:48
 */
package com.bjsxt.cn.strategy;
public class OldCustomerLarge implements Strategy {
 @Override public double getPrice(double oldPrice) {  System.out.println(" 老客户大批量,六折");  return oldPrice * 0.6; } }
===================================================
/**
 * 需要用到不同打折策略的上下文
 */
package com.bjsxt.cn.strategy;
import java.awt.print.Printable;
public class Context {
 private Strategy strategy;
 //可以通过构造器注入策略
 public Context(Strategy strategy) {
  super();
  this.strategy = strategy;
 }
 //可以通过set方法来注入策略
 public void setStrategy(Strategy strategy) {
  this.strategy = strategy;
 }
 
 public void PrintPrice(double oldPrice) {
  double discountedPrice = strategy.getPrice(oldPrice);
  System.out.println(discountedPrice);
 }
}
========================================
/**
 * 客户程序
 * 策略模式对英语解决某一个问题的一个算法组,
 * 允许用户从该算法族中任选一个算法解决某一问题,
 * 同时可以方柏霓的更换算法或者增加新的算法。
 * 并且由客户端决定调用那个算法。
 *
 * 客户端负责和具体的策略类进行交互。
 * 这样的话,具体的算法和直接的客户段调用分离了,使得算法可以独立于客户端独立的变化。
 * 如果使用Spring的依赖注入功能,还可以通过配置文件,动态的注入不同的策略对象,动态切换不同的算法。
 *
 */
package com.bjsxt.cn.strategy;
public class Client {
 public static void main(String[] args) {
  Strategy strategy = new OldCustomerFew();
  Context ctx = new Context(strategy);
  ctx.PrintPrice(900);
  ctx.setStrategy(new NewCustomerFew());
  ctx.PrintPrice(900);
  
  ctx.setStrategy(new OldCustomerLarge());
  ctx.PrintPrice(900);
 }
}
/*
老客户小批量, 七折
630.0
新客户小批量,不打折
900.0
 老客户大批量,六折
540.0
 *
 */
==========================================
 

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: