模板方法模式---设计模式(17)
2018-06-17 21:06:17来源:未知 阅读 ()
一、定义
模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
解释:简单来说,需要定义一个通用的基类,但是基类中不同的操作,于是模板方法模式将不同的操作编写成一个抽象函数放到子类中实现,这样即可完成通用基类的目的。
二、UML类图及基本代码
基本代码:
abstract class AbstractClass { public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); Console.WriteLine("基类的行为"); } } class ConcreteClassA : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类A方法1的实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类A方法2的实现"); } } class ConcreteClassB : AbstractClass { public override void PrimitiveOperation1() { Console.WriteLine("具体类B方法1的实现"); } public override void PrimitiveOperation2() { Console.WriteLine("具体类B方法2的实现"); } }
客户端调用及结果:
AbstractClass ac; ac = new ConcreteClassA(); ac.TemplateMethod(); Console.WriteLine(""); ac = new ConcreteClassB(); ac.TemplateMethod();
三、实例说明
日常生活中做菜这件事,虽然做不同的菜的方式不一样,但绝大多数步骤是一样的,本例用炒菠菜和炒白菜作为实例进行说明模板方法模式,基本代码如下:
public abstract class Vegetable { public void CookVegetable() { Console.WriteLine("烧蔬菜的一般方法:"); this.PoilOil(); this.HeatOil(); PourVegetable(); } public void PoilOil() { Console.WriteLine("倒油"); } public void HeatOil() { Console.WriteLine("把油烧热"); } public abstract void PourVegetable(); } public class Spinach : Vegetable { public override void PourVegetable() { Console.WriteLine("菠菜倒进锅中"); } } public class Cabbage : Vegetable { public override void PourVegetable() { Console.WriteLine("白菜倒进锅中"); } }
客户端调用及运行结果:
Vegetable sp = new Spinach(); sp.CookVegetable();
四、优缺点及适用场景
优点:
1)实现了代码复用
2)能够灵活应对子类步骤的变化,符合开放-封闭原则
即:封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:
引入了一个抽象类,使系统逻辑更加复杂。
适用场景:
模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现其优势。因此凡是能体现此优点的地方都可以使用模板方法模式。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:数据库语法03
- python_字符串方法 2019-08-13
- python_公共方法 2019-08-13
- 利用python自动生成verilog模块例化模板 2019-08-13
- python3 之 判断闰年小实例 2019-08-13
- JavaScript获取Django模板中指定键值的数据,使用过滤器 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash