zoukankan      html  css  js  c++  java
  • 模板方法模式

    定义一个方法,安排算法的步骤,算法每一步的详细实现策略可以延迟到子类执行。

    可以在算法里定义hook,让客户选择性的改变算法的策略,而不需要本身算法的步骤。

     代码示例:

     1 package templmethod;
     2 
     3 abstract class Audi {
     4     
     5     protected boolean isWhistle;
     6     
     7     protected void start(){
     8         System.out.println("starting....");
     9     }
    10     
    11     protected void stop(){
    12         System.out.println("stopped....");
    13     }
    14     
    15     protected abstract void driveNormal();
    16     
    17     protected abstract void driveSlowly();
    18     
    19     protected void reverse(){
    20         setWhistle();
    21         if(isWhistle){
    22             System.out.println("倒车请注意...倒车请注意...");
    23             System.out.println("backing now....");
    24         }else{
    25             System.out.println("backing now....");
    26         }
    27     }
    28     
    29     public void setWhistle(){
    30         this.isWhistle = true;
    31     }
    32         
    33     
    34 }
    View Code
     1 package templmethod;
     2 
     3 public class AudiA4 extends Audi{
     4 
     5     @Override
     6     public void driveNormal() {
     7         System.out.println("A4 high-end driving normally....");
     8     }
     9 
    10     @Override
    11     public void driveSlowly() {
    12         System.out.println("A4 high-end driving slowly....");
    13     }
    14     
    15     @Override
    16     public void setWhistle() {
    17         isWhistle =  false;
    18     }
    19 
    20 
    21 }
    View Code
     1 package templmethod;
     2 
     3 public class AudiC5 extends Audi {
     4 
     5     @Override
     6     public void driveNormal() {
     7         System.out.println("C5 stdeady driving normally....");
     8     }
     9 
    10     @Override
    11     public void driveSlowly() {
    12         System.out.println("C5 stdeady driving slowly....");
    13     }
    14     
    15     @Override
    16     public void setWhistle() {
    17         isWhistle = true;
    18     }
    19 
    20 }
    View Code
     1 package templmethod;
     2 
     3 public class Driver {
     4     private Audi myCar;
     5     
     6     /*传说中的定义算法的方法,具体的步骤由它规定,任何人都不可以改变;
     7      * 但是每一步是可以通过子类的延迟实现,来定义的
     8      */
     9     public void driveCar(){
    10         myCar.start();
    11         myCar.driveNormal();
    12         System.out.println("GPS提示:前方90度急转弯....");
    13         myCar.driveSlowly();
    14         System.out.println("GPS提示:前方无路可走....");
    15         myCar.reverse();
    16     }
    17     
    18     public void stopCar(){
    19         myCar.stop();
    20     }
    21     
    22     public void buyCar(Audi audi){
    23         this.myCar = audi;
    24     }
    25 }
    View Code
     1 package templmethod;
     2 
     3 public class Client {
     4     public static void main(String[] args) {
     5         Driver driver = new Driver();
     6         driver.buyCar(new AudiA4());
     7         driver.driveCar();
     8         
     9         System.out.println("--------------------------------------");
    10         
    11         driver.buyCar(new AudiC5());
    12         driver.driveCar();
    13         
    14     }
    15 }
    View Code

    输出结果:

    starting....
    A4 high-end driving normally....
    GPS提示:前方90度急转弯....
    A4 high-end driving slowly....
    GPS提示:前方无路可走....
    backing now....
    --------------------------------------
    starting....
    C5 stdeady driving normally....
    GPS提示:前方90度急转弯....
    C5 stdeady driving slowly....
    GPS提示:前方无路可走....
    倒车请注意...倒车请注意...
    backing now....
    

      

  • 相关阅读:
    用grunt搭建自动化的web前端开发环境-完整教程
    redis 使用
    ubuntu系统安装redis
    redis resque消息队列
    linux下常用的命令
    介绍Mina的TCP的主要接口(一)
    Mina框架详解——简单的TCPClient
    Mina框架详解——简单的TCPServer
    Mina框架知识解析
    RabbitMQ新手入门Helloworld
  • 原文地址:https://www.cnblogs.com/tisakong/p/4699214.html
Copyright © 2011-2022 走看看