一、策略模式(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_行为型模式(策略模式、模板方法模式)的更多相关文章

  1. (转)《JAVA与模式》之模板方法模式

    该文章转自:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  2. 《JAVA与模式》之模板方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  3. C#设计模式之十四模板方法模式(Template Method)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  4. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图   相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为 ...

  5. C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  6. 行为型模式(一) 模板方法模式(Template Method)

    一.动机(Motivate) "模板方法",就是有一个方法包含了一个模板,这个模板是一个算法.在我们的现实生活中有很多例子可以拿来说明这个模式,就拿吃饺子这个事情来说,要想吃到饺子 ...

  7. 深入浅出设计模式——模板方法模式(Template Method Pattern)

    模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式 ...

  8. [设计模式]<<设计模式之禅>>模板方法模式

    1 辉煌工程——制造悍马 周三,9:00,我刚刚坐到位置上,打开电脑准备开始干活. “小三,小三,叫一下其他同事,到会议室开会”,老大跑过来吼,带着坏笑.还没等大家坐稳,老大就开讲了:“告诉大家一个好 ...

  9. C#设计模式学习笔记:(13)模板方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...

  10. 模板方法模式(Template Method)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

随机推荐

  1. 微信小程序初体验

    小程序最近太火,不过相比较刚发布时,已经有点热度散去的感觉,不过这不影响我们对小程序的热情,开发之前建议通读下官网文档,附链接:https://mp.weixin.qq.com/debug/wxado ...

  2. Java Calendar Date使用总结

    Java Calendar Date使用总结 package cn.outofmemory.codes.Date; import java.util.Calendar; import java.uti ...

  3. Servlet学习系列1

    一.引言: 1.什么是Servlet? JavaWeb 开发规范中的一个组成部分. 服务器端的一段小程序(代码)   2.什么是服务器?→ 安装了服务器软件的计算机. 硬件:电脑 --->高性能 ...

  4. RGB与INT类型的转换

    开发时遇到的问题,设置图层样式时颜色的返回值是uint,一时不知改怎么转换为C#常用的RGB值了. 一番百度,结果如下: RGB = R + G * 256 + B * 256 * 256 因此可得到 ...

  5. 微信小程序-03-小程序开发框架

    微信小程序-03-小程序开发框架 官方文档: https://developers.weixin.qq.com/miniprogram/dev/framework/MINA.html 小程序开发框架 ...

  6. Android 虚拟多开系列二——技术原理

    目录         Android虚拟多开应用有哪些?         Android虚拟多开应用技术原理有哪几类?         Android虚拟多开需求分析         反虚拟多开技术 ...

  7. window 7 & 2008R2 多核cpu套接字泄露补丁

    http://hotfixv4.microsoft.com/Windows%207/Windows%20Server2008%20R2%20SP1/sp2/Fix373886/7600/free/43 ...

  8. 数据预处理(Python scikit-learn)

    在机器学习任务中,经常会对数据进行预处理.如尺度变换,标准化,二值化,正规化.至于采用哪种方法更有效,则与数据分布和采用算法有关.不同算法对数据的假设不同,可能需要不同的变换,而且有时无需进行变换,也 ...

  9. MAC电脑安装svn客户端cornerstone

    个人感觉在mac上最好用的svn客户端就是cornerstone,公司客户端也统一使用这个 sudo spctl --master-disable 这条命令作用就是使得mac运行安装任何来源App,不 ...

  10. apache 配置PHP的支持重写伪静态

    1.开启rwrite模块 LoadModule rewrite_module modules/mod_rewrite. 允许任何目录使用.htaccess AllowOverride None 改成 ...