[19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)
2024-08-24 11:37:05
一、策略模式(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步:取款;"); }
}
最新文章
- 二叉树节点个数题目[n0,n1,n2]
- 不错的判断 UITextView 内容不超过20个字符串的方法
- php实现上传图片保存到数据库的方法
- shell 统计GMT0 时区的数据
- iOS - OC NSTimer		定时器
- 让你的.NET程序支持多语言
- JNI|在子线程中获得JNIEnv|AttachCurrentThread
- Xcode7.01相对于底版本的变动小结
- javascript访问级别
- c++ 使用全局变量的方法多个文件
- 【锋利的Jquery】读书笔记六
- 页面引入css用link和import的区别
- cookie 使用方法
- python3+selenium入门12-警告框处理
- [译]ElasticSearch vs. Solr
- Python Web学习笔记之SOCK_STREAM和SOCK_DGRAM
- 联想服务器配置 RAID
- 利用flask-sqlacodegen快速导入ORM表结构
- 20162325 金立清 S2 W6 C15
- 利用ftrace跟踪内核static tracepoint
热门文章
- 撩课-MySQL详解1-数据库简介
- linux的目录结构及文件基本操作
- Qless 相关知识
- csu 1356 Catch bfs(vector)
- CodeForces 606A(水)
- VC+++ 操作word
- Luogu3307:[SDOI2013]项链
- 实现键盘记录的e.Whick和keyCode,兼容FireFox和IE
- Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
- Android解析ClassLoader(一)Java中的ClassLoader