zoukankan      html  css  js  c++  java
  • 行为类模式(十):模板方法(Template Method)

    定义

    定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

    UML

    优点

    1. 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
    2. 子类实现算法的某些细节,有助于算法的扩展。
    3. 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

    缺点

    1. 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

    应用场景

    1. 在某些类的算法中,用了相同的方法,造成代码的重复。
    2. 控制子类扩展,子类必须遵守算法规则。

    示例

    使用模板方法来读取XML和数据库中的数据。

    Java

     1 import java.util.HashMap;
     2 import java.util.Map;
     3 
     4 public class Main
     5 {
     6     public static void main(String[] args)
     7     {
     8         DataView dataView;
     9         
    10         dataView = new XMLDataView();
    11         dataView.loadData();
    12         dataView.show();
    13 
    14         dataView = new DatabaseDataView();
    15         dataView.loadData();
    16         dataView.show();
    17     }
    18 
    19     /**
    20      * 数据显示基类
    21      */
    22     public static abstract class DataView
    23     {
    24         private Map<String, String> _map;
    25         
    26         /**
    27          * 加载数据
    28          */
    29         public void loadData()
    30         {
    31             _map = parseData();
    32         }
    33 
    34         /**
    35          * 模板方法,针对不同的数据源编写不同的读取和解析方法
    36          */
    37         protected abstract Map<String, String> parseData();
    38 
    39         /**
    40          * 显示读取的数据
    41          */
    42         public void show()
    43         {
    44             for (String key : _map.keySet())
    45             {
    46                 System.out.println(key + ": " + _map.get(key));
    47             }
    48         }
    49     }
    50 
    51     /**
    52      * 读取外部XML中配置的数据
    53      */
    54     public static class XMLDataView extends DataView
    55     {
    56         @Override
    57         protected Map<String, String> parseData()
    58         {
    59             // TODO : 这里加载外部XML的数据并进行解析
    60             
    61             Map<String, String> map = new HashMap<>();
    62             map.put("数据1", "我是来自XML文件中的数据1");
    63             map.put("数据2", "我是来自XML文件中的数据2");
    64             return map;
    65         }
    66     }
    67 
    68     /**
    69      * 读取数据库中配置的数据
    70      */
    71     public static class DatabaseDataView extends DataView
    72     {
    73         @Override
    74         protected Map<String, String> parseData()
    75         {
    76             // TODO : 这里加载数据库中的数据并进行解析
    77 
    78             Map<String, String> map = new HashMap<>();
    79             map.put("数据1", "我是来自数据库中的数据1");
    80             map.put("数据2", "我是来自数据库中的数据2");
    81             return map;
    82         }
    83     }
    84 }
    View Code
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/hammerc/p/4743819.html
Copyright © 2011-2022 走看看