行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式

简介: 1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类。子类通过继承这个抽象基类去实现各个步聚的抽象方法,而工作流程却由父类来控制。

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     @Override
11     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 price
13      * @return
14      */
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     @Override
10     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 }

 

上面例子中的事件没有全部写完的! 
 
 
 
 
 
 
 
相关文章
|
5月前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
2月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
21 0
|
4月前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
3月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
80 0
|
4月前
|
设计模式 算法
模板方法-大话设计模式
模板方法-大话设计模式
|
5月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
4月前
|
设计模式 存储
行为型设计模式之观察者模式
行为型设计模式之观察者模式
|
4月前
|
设计模式 算法
行为型设计模式
行为型设计模式
|
5月前
|
设计模式 Java
设计模式之策略 Strategy
设计模式之策略 Strategy
39 1
|
4月前
|
设计模式 存储 Java
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
23 0