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

 

posted @ 2019-04-29 01:40  ID长安忆  阅读(185)  评论(0编辑  收藏  举报