[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步:取款;"); } }