一、策略模式(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. angular2 *ngIf与[hidden]对比<转>

    在AngularJS 1中,如果想切换DOM元素的显示状态,估计你会用AngularJS 1内置的指令如:ng-show 或者 ng-hide: AngularJS 1示例: <div ng-s ...

  2. 一个JNI的helloworld小demo

    最近想学习一下jni,在网上看了一些demo,自己也操作了一遍,首先我将我自己学习的demo网站贴出来:https://blog.csdn.net/lwcloud/article/details/78 ...

  3. SuperSubScriptHelper——Unicode上下标辅助类

    在项目的实施过程中,类似化学分子式.平方.立方等,需要处理上.下标字符. 上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化标记实现上下标字符的显示. Word中的 ...

  4. python学习之老男孩python全栈第九期_day019作业

    # 计算时间差 import time start_time = time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S' ...

  5. CodeChef SADPAIRS:Chef and Sad Pairs

    vjudge 首先显然要建立圆方树 对于每一种点建立虚树,考虑这一种点贡献,对于虚树上已经有的点就直接算 否则对虚树上的一条边 \((u, v)\),\(u\) 为父亲,假设上面连通块大小为 \(x\ ...

  6. Maven学习总结(二):安装

    一:Maven下载 下载地址:http://maven.apache.org/download.cgi 下载完成后,得到一个压缩包,解压,可以看到maven的组成目录 Maven目录分析 bin:含有 ...

  7. 理解webpack4.splitChunks之cacheGroups

    cacheGroups其实是splitChunks里面最核心的配置,一开始我还认为cacheGroups是可有可无的,这是完全错误的,splitChunks就是根据cacheGroups去拆分模块的, ...

  8. UTF-8和GBK编码转换iconv

    iconv("GBK", "UTF-8", $str);//将GBK编码转换成UTF8编码

  9. Android链接蓝牙电子称

    蓝牙一直是我内心屏蔽的一个模块哈哈哈哈!然而今天我不得不正视它了,我百度了看了好多因为需要设备匹配所以设备不在没办法测试,几天之后设备到了.因为没有接触过,看到返回的打印出来的菱形方块就以为是错了.于 ...

  10. C# 元素组合算法

    class Program { static void Main(string[] args) { string[] a = { "A", "B", " ...