[19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)
一、策略模式(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步:取款;"); }
}
[19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)的更多相关文章
- (转)《JAVA与模式》之模板方法模式
该文章转自:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 在阎宏博士的<JAVA与模式>一书中开头 ...
- 《JAVA与模式》之模板方法模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- C#设计模式之十四模板方法模式(Template Method)【行为型】
一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...
- 模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...
- C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】
一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...
- 行为型模式(一) 模板方法模式(Template Method)
一.动机(Motivate) "模板方法",就是有一个方法包含了一个模板,这个模板是一个算法.在我们的现实生活中有很多例子可以拿来说明这个模式,就拿吃饺子这个事情来说,要想吃到饺子 ...
- 深入浅出设计模式——模板方法模式(Template Method Pattern)
模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...
- [设计模式]<<设计模式之禅>>模板方法模式
1 辉煌工程——制造悍马 周三,9:00,我刚刚坐到位置上,打开电脑准备开始干活. “小三,小三,叫一下其他同事,到会议室开会”,老大跑过来吼,带着坏笑.还没等大家坐稳,老大就开讲了:“告诉大家一个好 ...
- C#设计模式学习笔记:(13)模板方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...
- 模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
随机推荐
- mysql数据库重点(基础优化)
### Mysql性能优化 尽量不要写select * ,如果需要全表数据,使用select 加所有字段列名称查询代替* 尽量减少字段列的数学计算,如:where num * 2 >= 30,可 ...
- JDBC增加、更新、删除数据
JDBC增加.更新.删除数据 st.executeUpdate(sql) 进行插入.更新.删除操作返回的是受影响的记录的条数 注意:输入的sql语句中,vachar类型记住加单引号 完整代码如下: p ...
- HDU 2639(01背包第K大)
http://acm.hdu.edu.cn/showproblem.php?pid=2639 http://blog.csdn.net/lulipeng_cpp/article/details/758 ...
- HDU 2433 (最短路+BFS+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=2433 这个问题因为路径都是1,所以可以用bfs遍历 可以看这几篇文章讲解: http://blog.csdn.n ...
- python安装后无法用cmd命令pip 装包
出现问题: 原因:没有添加环境变量. 解决方法:将python安装目录下的Script目录添加进环境变量,其中有pip.exe,在cmd中输入pip install命令时要运行pip.exe. win ...
- git杂记-撤销操作
覆盖上一次的提交或重新更新提交说明 $ git commit --amend -m '我再次提交啦,上一次的提交已经不见啦.这是一个危险的操作哦.哈哈,其实并不危险,也是可以数据恢复的啦' 取消已暂存 ...
- String对象的match方法
RegExp对象的exec方法和String对象的match方法用法十分相似,分两篇博客讲讲其各自的用法和它们之间的异同.上一篇将exec方法的用法,这篇讲解match方法,并比较其异同. 定义与语法 ...
- bootstrap学习笔记细化(表单)
主要属性: class="form-inline" 水平排列 class="form-group" 组键 form-control 圆角方框发光 input-l ...
- 解决:Thinkphp3 返回中文内容出现乱码
- 基于Vue的WebApp项目开发(六)
实现商品购买列表页面 步骤一:新建goodslist.vue文件 <template> <div id="tml"> <!--利用mui中的图文表格组 ...