博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式
阅读量:6326 次
发布时间:2019-06-22

本文共 2733 字,大约阅读时间需要 9 分钟。

1 模板方法(TEMPLATE METHOD)模式:

模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类。子类通过继承这个抽象基类去实现各个步聚的抽象方法,而工作流程却由父类来控制。 
2 模板方法应用于下列情况:
 1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
 2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3 结构图:
抽象类:定义抽象的原语操作,具体的子类将重定义它们以实现一个算法, 实现一个模板方法,定义一个算法的骨架。
具体类:实现原语操作以完成算法中与特定子类相关的步骤。
4 同样举个例子:
抽象类:
 
1 public abstract  class Car { 2      3     public abstract void makeHead(); 4      5     public abstract void makeBody(); 6      7      8     public void makeCar(){ 9       this.makeHead();10       this.makeBody();11     }12     13     14 15 }

 具体类:

1 public class Bus  extends  Car { 2  3     @Override 4     public void makeHead() { 5      6          System.out.println("产生bus车头"); 7                  8     } 9 10     @Override11     public void makeBody() {12         13          System.out.println("产生bus车身");14         15     }16 17 }

 

测试:

1 public class Test { 2      3     public static void main(String[] args) { 4              5         Car car = new Jeep(); 6         car.makeCar(); 7          8          9     }10 11 }
这是一个很简单的模式,却被非常广泛的使用。之所以简单是因为在这个模式中仅仅使用到了继承关系。
 
 二:策略(Strategy )模式
 
 1 策略(Strategy )模式:
在业务当中常常出现一个问题有一组算法,在不同的情况下我们有可能使用不同的算法。我们需要找到一种灵活简便的设计方式:将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
 2结构图:
3 举个例子:
常见的购物问题:
  向客户报价,对于销售部门的人来讲,这是一个非常复杂的问题,对不同的客户要报不同的价格,比如:
–对普通客户或者是新客户报的是全价;
–对老客户报的价格,根据客户年限,给予一定的折扣;
–对大客户报的价格,根据大客户的累计消费金额,给予一定的折扣;
–还要考虑客户购买的数量和金额,比如:虽然是新用户,但是一次购买的数量非常大,或者是总金额非常高,也会有一定的折扣;
–还有,报价人员的职务高低,也决定了他是否有权限对价格进行一定的浮动折扣;
总之,向客户报价是非常复杂的
java代码:
1 package ooad.design.Strategy;2 /**3  * 报价接口4  * @author hellokitty燕5  *6  */7 public interface Quoteprice {8      public double quoteprice(double price);9 }

 

1 package ooad.design.Strategy; 2  3 public class Content { 4     private Quoteprice quoteprice; 5  6     public Content(Quoteprice quoteprice) { 7         super(); 8         this.quoteprice = quoteprice; 9     }10     /**11      * 折扣12      * @param price13      * @return14      */15     public double discounting(double price){16         return quoteprice.quoteprice(price);17         18     }19 20 }

 

 
1 package ooad.design.Strategy; 2 /** 3  * 新用户 4  * @author hellokitty燕 5  * 6  */ 7 public class NewUser implements Quoteprice{ 8  9     @Override10     public double quoteprice(double price) {11         if(price>10000){12             return price*0.95;13         }14         15         return price;16     }17 18 }

 测试类:

1 package ooad.design.Strategy; 2  3 public class Test { 4  5     public static void main(String[] args) { 6         Quoteprice q=new NewUser(); 7         Content c=new Content(q); 8        double ne= q.quoteprice(20000); 9        System.out.println(ne);10     }11 12 }

 

上面例子中的事件没有全部写完的! 
 
 
 
 
 
 
 

转载地址:http://ujgaa.baihongyu.com/

你可能感兴趣的文章
oracle多实例的启动与关闭
查看>>
码农生涯杂记_4
查看>>
利用jQuery设计横/纵向菜单
查看>>
unity游戏开发之NGUI的UISprite染色
查看>>
HDOJ find the safest road 1596【最短路变形】
查看>>
高度决定视野眼界决定世界
查看>>
shell脚本路径写法的注意点
查看>>
Testng生成的测试报告乱码解决办法
查看>>
vim快速入门
查看>>
大杂烩 -- 单向链表是否存在环或是否相交
查看>>
关键字检索高亮标出-javasript/jQuery代码实现
查看>>
Vijos P1785 同学排序【模拟】
查看>>
人物关系网络图可视化
查看>>
关于ADO.Net SqlConnection的性能优化
查看>>
docker安装及加速配置
查看>>
MRF能量优化
查看>>
什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
查看>>
Atlas Control ToolKit 发布
查看>>
Dundas 系列
查看>>
Windows的命令行查看,修改,删除,添加环境变量
查看>>