`
zhaoImpulse
  • 浏览: 80549 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Template Method模式和Strategy模式:继承与委托

 
阅读更多

Themeplate Method

 

public abstract class Application {
	protected abstract void init();
	protected abstract void idle();
	protected abstract void cleanup();
	private boolean isDone = false;
	protected void setDone(){
		this.isDone = true;
	}
	protected boolean done(){
		return isDone;
	}
	public void run(){
		init();
		while(!done())
			idle();
		cleanup();
	}
}

 

public class WorkTemplateMethod extends Application {
	public static void main(String[] args){
		new WorkTemplateMethod().run();
	}
	@Override
	protected void cleanup() {
		System.out.println("clean up.");
	}
	@Override
	protected void idle() {
		System.out.println("idle.");setDone();
	}
	@Override
	protected void init() {
		System.out.println("init.");
	}
}

 

Template Method模式展示了面向对象编程中诸多经典重用形式的一种。其中通用算法run()被放置在基类中,并且通过继承在不同的具体上下文中实现该通用算法。

但这项技术也是有代价的。继承是一种非常强的关系,派生类不可避免地要和它们的基类绑定在一起。

如果有个类Application2也需要WorkTemplateMethod中的idle()方法。然而却没法重用,由于继承了Application,就注定把WorkTemplateMethod永远地和Application绑定在了一起。

这时,我们就需要Strategy模式。

Strategy模式

 

public class ApplicationRunner {
	private Application app = null;
	
	public ApplicationRunner(Application app){
		this.app = app;
	}
	public void run(){
		app.init();
		while(!app.done())
			app.idle();
		app.cleanup();
	}
}

 

 

public interface Application {
	public void init();
	public void idle();
	public void cleanup();
	public boolean done();
}

 

 

 

public class WorkStrategy implements Application {
	private boolean isDone = false;

	@Override
	public void cleanup() {
		System.out.println("clean up.");
	}

	@Override
	public boolean done() {
		return isDone;
	}

	@Override
	public void idle() {
		System.out.println("idle.");
		isDone = true;
	}

	@Override
	public void init() {
		System.out.println("init.");
	}

	public static void main(String[] args) {
		new ApplicationRunner(new WorkStrategy()).run();
	}
}

 

WorkStrategy对ApplicationRunner一无所知(main方法作为一个调用的例子,通常它都会在测试类中),它不依赖于run逻辑的任何实现方式。这和TemplateMethod模式是不同的,WorkTemplateMethod完全依赖于它的父类Application中run的逻辑,因而违反了DIP原则,而Strategy方法中不包含这中依赖。因此,当有别的逻辑出现时,也可以复用WorkStrategy实例中的方法。

 

 

public class ApplicationRunner2 {
private Application app = null;
	
	public ApplicationRunner2(Application app){
		this.app = app;
	}
	public void go(){
		//app.init();  不调用init方法
		while(!app.done())
			app.idle();
		app.cleanup();
	}
}

 

 这样,只要使用new ApplicationRunner2(new WorkStrategy()).go()就可以了。

因此,Strategy模式比TemplateMethod模式多推荐了一个额外的好处。尽管TemplateMethod模式允许一个通用算法(run逻辑)操作多个可能的具体实现,但是由于Strategy模式完全遵循DIP原则,从而请允许每个具体实现都可以被多个不两只的通用算法(run逻辑或go逻辑)操纵。

一句话,少用继承,多用接口。

 

  • 大小: 29.3 KB
分享到:
评论

相关推荐

    敏捷软件开发:原则、模式与实践

    第14章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第15章 FACADE模式和MEDIATOR模式 第16章 SINGLETON模式和MONOSTATE模式 第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付...

    敏捷软件开发:原则、模式与实践.pdf

    第十四章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第十五章 FACADE模式和MEDIATOR模式 第十六章 SINGLETON模式和MONOSTATE模式 第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九...

    敏捷软件开发:原则、模式与实践.pdf

    第14章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第15章 FACADE模式和MEDIATOR模式 第16章 SINGLETON模式和MONOSTATE模式 第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付...

    敏捷软件开发原则、模式与实践 C#版

    薪水支付案例研究 第21章 COMMAND模式和ACTIVE OBJECT模式:多功能与多任务 第22章 TEMPLATE METHOD模式和STRATEGY模式:继承和委托 第23章 FACADE模式和MEDIATOR模式 第24章 SINGLETON模式和MONOSTATE模式 第25章 ...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    3. 行为型模式:这类模式关注对象间的交互和职责分配,包括策略(Strategy)、模板方法(Template Method)、迭代器(Iterator)、访问者(Visitor)、责任链(Chain of Responsibility)、命令(Command)、备忘录...

    .Net设计模式讲解

    12. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 13. 观察者模式(Observer Pattern):...

    23个设计模式C#代码

    18. 模板方法模式(Template Method):在抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中。C#中,模板方法模式通过抽象类和重写虚方法实现。 19. 访问者模式(Visitor):在不改变类结构的情况下,...

    .NET23种设计模式【完整】

    20. **模板方法模式(Template Method)**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。C#中的虚方法和抽象方法体现了模板方法模式。 ...

    C#23种设计模式【完整】(测试可用)

    21. 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 22. 访问者模式(Visitor):表示一个作用于某...

    C#23种设计模式【完整】.rar

    这些设计模式的实现通常涉及到接口定义、类的继承、多态等面向对象特性,以及C#语言中的一些高级特性如委托、事件、泛型等。理解并熟练应用这些设计模式,有助于编写出更加高效、灵活和易于维护的C#代码。通过学习和...

    c#设计模式随书源码

    13. 模板方法模式(Template Method):模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。C#中的虚方法和抽象类经常用来实现模板方法模式。 14. 组合模式(Visitor):访问者模式为对象结构提供一...

    c#设计模式电子书资源下载

    - **模板方法模式(Template Method)**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。C#中可以使用`虚方法`和`抽象方法`来实现模板方法。 这些模式是C#开发者必备的知识,它们不仅能够帮助编写更优雅的...

    C#设计模式示例代码

    22. 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。C#中,可以使用虚方法和抽象方法来实现。 23. ...

    C#设计模式PDF 电子书

    十、模板方法模式(Template Method) 模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 这些设计模式是软件开发中的宝贵...

    C# 经典设计模式。。

    12. 模板方法模式(Template Method):模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 13. 策略模式(Strategy):策略...

    C#设计模式(PDF)

    再者,“行为型”设计模式关注对象之间的交互和责任分配,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、备忘录模式(Memento...

    C# 23种设计模式代码

    13. 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。C#中的虚方法和抽象方法就是模板方法的体现。 14. 观察者模式(Observer):定义对象间的一种一对多依赖关系,当一个...

Global site tag (gtag.js) - Google Analytics