首页 > 其他分享 >设计模式(二十二)模板方法

设计模式(二十二)模板方法

时间:2024-01-22 14:58:57浏览次数:26  
标签:二十二 account 父类 子类 设计模式 方法 public 模板

一、定义

定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的特定步骤。模板方法是一种类行为型模式

二、描述

模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计,包含以下两个角色:
1、AbstractClass(抽象类):在抽象类中定义了一系列基本操作(Primitive Operations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重新定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架。
2、ConcreteClass(具体子类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

三、例子

X公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程如下:
(1)系统根据账号和密码验证用户信息,如果用户信息错误,系统显示错误提示。
(2)如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(例如活期账户和定期账户具有不同的利息计算公式)
(3)系统显示利息。

Account:抽象类

public abstract class Account
{
    // 基本方法 - 具体方法
    public bool Validate(string account, string password)
    {
        Console.WriteLine("账号 : {0}", account);
        Console.WriteLine("密码 : {0}", password);

        if (account.Equals("张无忌") && password.Equals("123456"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    // 基本方法 - 抽象方法
    public abstract void CalculateInterest();

    // 基本方法 - 具体方法
    public void Display()
    {
        Console.WriteLine("显示利息");
    }

    // 基本方法 - 钩子方法
    public virtual bool IsAllowDisplay()
    {
        return true;
    }

    // 模板方法
    public void Handle(string account, string password)
    {
        if (!Validate(account, password))
        {
            Console.WriteLine("账户或密码错误,请重新输入!");
            return;
        }

        CalculateInterest();

        if (IsAllowDisplay())
        {
            Display();
        }
    }
}

CurrentAccount、SavingAccount:活期存款、定期存款,充当具体子类

public class CurrentAccount : Account
{
    // 重写父类的抽象基本方法
    public override void CalculateInterest()
    {
        Console.WriteLine("按活期利率计算利息!");
    }

    // 重写父类的钩子方法
    public override bool IsAllowDisplay()
    {
        return base.IsAllowDisplay();
    }
}

public class SavingAccount : Account
{
    // 重写父类的抽象基本方法
    public override void CalculateInterest()
    {
        Console.WriteLine("按定期利率计算利息!");
    }

    // 重写父类的钩子方法
    public override bool IsAllowDisplay()
    {
        return false;
    }
}

Program:测试代码

Account account = new CurrentAccount();
if (account != null)
{
    account.Handle("张无忌", "123456");
}
Console.ReadLine();

四、总结

1、优点

(1)在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。
(2)模板方法模式是一种代码复用技术,在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励用户恰当地使用继承来实现代码复用。
(3)模板方法模式可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。
(4)在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。

2、缺点

(1)模板方法模式需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统会更加庞大,设计也会更加抽象,此时,可结合桥接模式来进行设计。

标签:二十二,account,父类,子类,设计模式,方法,public,模板
From: https://www.cnblogs.com/WinterSir/p/17573994.html

相关文章

  • 【秀米教程9】制作专属秀米模板,更加适应你的工作内容
    你是否想在秀米中拥有自己的专属模板呢?你是否想更快捷的完成工作然后摸鱼呢?你是否经常用一些特定的模板呢?一起来看看......
  • 设计模式
    八大原则:依开单替,接优封针依:依赖倒置原则高层次的代码不应该依赖低层次的代码,应该依赖抽象、抽象的代码不应该依赖具体的代码开:开闭原则对扩展开放,对修改关闭单:单一职责一个类应该仅有一个变化的原因,该变化隐含了它的职责,职责太多会造成混乱替:替换原则子类必须能够替换他......
  • js设计模式之命令模式
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>命令模式</title></head><body><buttonid="btn1">刷新菜单</button><buttonid="btn2">增......
  • 自定义按钮模板
    自定义按钮模板本文同时为b站WPF课程的笔记,相关示例代码对应09上半节课自定义模板对于当前的这个样式不满意——想要自己控制它这个控件长什么样子比如在一节课中,为了实现圆角按钮,我们是从网上面抄了一段代码过来那么,如何建立一种自带圆角的按钮模板呢?<ButtonWidth="300"......
  • 设计模式—行为型模式之观察者模式
    设计模式—行为型模式之观察者模式观察者模式(ObserverPattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模......
  • js设计模式之观察者模式
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>观察者模式</title></head><body><script>classEvent{constructor(){}//事件容器,可以是一个也可以是......
  • P1886 滑动窗口 /【模板】单调队列
    P1886滑动窗口/【模板】单调队列https://www.luogu.com.cn/problem/P1886 思路https://zhuanlan.zhihu.com/p/346354943 Codehttps://www.luogu.com.cn/record/143623041LLn,k;LLa[1000005];deque<LL>maxd,mind;intmain(){cin>>n>>k;......
  • 《图解设计模式》PDF
    内容简介原版连续畅销12年、重印25次!194张图表+Java示例代码=轻松理解GoF的23种设计模式《程序员的数学》《数学女孩》作者结城浩又一力作◆图文并茂194张图表(包括57张UML类图)穿插文中,帮助理解各设计模式◆通俗易懂用浅显的语言逐一讲解23种设计模式,读完此书会......
  • c++函数模板
    一.模板概念:就是建立通用的摸具,大大提高复用性特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的c++提供两种模板机制函数模板和类模板二.函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表作用:建立一个通用函数......
  • C++模板例子
    title:"C++模板例子"date:2023-11-02T01:05:25+08:00tags:["C++"]categories:[]draft:falsetoc:true#include<vector>#include<type_traits>usingnamespacestd;classAA{};classBB{};classTest{public:templ......