一、策略模式(strategy)

【策略接口】

/***
* "策略"接口
*/
package cn.sxt.strategy; public interface Strategy {
public double getPrice(double standrdPrice);//传进去一个原价,根据策略返回一个不同的价格 }

【策略管理类】

/***
* 管理算法的类。负责和策略类交互。这样算法可以独立于客户端。可以通过构造器注入或set方法或在配置文件注入
*/
package cn.sxt.strategy; public class Context {
private Strategy strategy;//当前采用的算法对象 public Context(Strategy strategy) {
super();
this.strategy = strategy;
} public void setStrategy(Strategy strategy) {
this.strategy = strategy;
} public void printPrince(double d) {//传进一个价格
System.out.println("我们应该报价:"+strategy.getPrice(d));
} }

【顾客类】

/**
* "客户类"和4个不同的客户类及4个算法族
*/
package cn.sxt.strategy; public abstract class Customer implements Strategy { } class NewCustomerFewGoods extends Customer{//新客户小批量 public double getPrice(double standrdPrice) {
System.out.println("普通客户小批量:不打折");
return standrdPrice;
}
} class NewCustomerManyGoods extends Customer{//新客户大批量 public double getPrice(double standrdPrice) {
System.out.println("普通客户大批量:打9折");
return standrdPrice*0.9;
}
} class OldCustomerFewGoods extends Customer{//老客户小批量 public double getPrice(double standrdPrice) {
System.out.println("老客户小批量:打8.5折");
return standrdPrice*0.85;
}
} class OldCustomerManyGoods extends Customer{//老客户大批量 public double getPrice(double standrdPrice) {
System.out.println("老客户大批量:打8折");
return standrdPrice*0.8;
}
}

【客户端类】

/**客户类
*
*/
package cn.sxt.strategy; public class CLient {
public static void main(String[] args) {
Strategy s1=new OldCustomerManyGoods();
Context ctxContext=new Context(s1);
ctxContext.printPrince(998);
} }

二、模板方法模式(template method)

【模板类】

/***模板:本质是多态
* 银行办业务的一般流程: 取号,办具体业务(不同),评分
*/
package cn.sxt.template; public abstract class BankTemplate {
public void takeNumber() {
System.out.println("第1步:取号机去取号;");
}
public abstract void transact();//办理具体业务,抽象方法 public void evaluate() {
System.out.println("第3步:给柜台人员打分.");
} //流程模板
public final void process() {
this.takeNumber();
this.transact();
this.evaluate(); } }

【客户】

/***
* 客户端
*/
package cn.sxt.template; public class Client {
public static void main(String[] args) {
BankTemplate btm=new DrawMoney();
btm.process(); //采用匿名内部类,定义存钱
BankTemplate btm2=new BankTemplate() {
@Override
public void transact() {
System.out.println("第2步:存款;");
}
};
btm2.process(); }
} //具体业务之一:取款
class DrawMoney extends BankTemplate{
public void transact() {//重写业务方法
System.out.println("第2步:取款;"); }
}

最新文章

  1. 二叉树节点个数题目[n0,n1,n2]
  2. 不错的判断 UITextView 内容不超过20个字符串的方法
  3. php实现上传图片保存到数据库的方法
  4. shell 统计GMT0 时区的数据
  5. iOS - OC NSTimer 定时器
  6. 让你的.NET程序支持多语言
  7. JNI|在子线程中获得JNIEnv|AttachCurrentThread
  8. Xcode7.01相对于底版本的变动小结
  9. javascript访问级别
  10. c++ 使用全局变量的方法多个文件
  11. 【锋利的Jquery】读书笔记六
  12. 页面引入css用link和import的区别
  13. cookie 使用方法
  14. python3+selenium入门12-警告框处理
  15. [译]ElasticSearch vs. Solr
  16. Python Web学习笔记之SOCK_STREAM和SOCK_DGRAM
  17. 联想服务器配置 RAID
  18. 利用flask-sqlacodegen快速导入ORM表结构
  19. 20162325 金立清 S2 W6 C15
  20. 利用ftrace跟踪内核static tracepoint

热门文章

  1. 撩课-MySQL详解1-数据库简介
  2. linux的目录结构及文件基本操作
  3. Qless 相关知识
  4. csu 1356 Catch bfs(vector)
  5. CodeForces 606A(水)
  6. VC+++ 操作word
  7. Luogu3307:[SDOI2013]项链
  8. 实现键盘记录的e.Whick和keyCode,兼容FireFox和IE
  9. Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
  10. Android解析ClassLoader(一)Java中的ClassLoader