`
TRAMP_ZZY
  • 浏览: 132028 次
社区版块
存档分类
最新评论

设计模式-模板方法模式

阅读更多
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template
Method lets subclasses redefine certain steps of an glgorithm without changing the algorithm's
structure.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可以重定义
该算法的某些特定步骤。

为了防止恶意的操作,一般模板方法都加上 final 关键字,不允许被覆写。
	public abstract class AbstractClass {

		protected abstract void doSomething();
		
		protected abstract void doAnything();
		
		public void templateMethod() {
		
			doSomething();
			doAnything();
			
		}
	}
	
	public class ConcreteClass1 extends AbstractClass {

		@Override
		protected void doSomething() {
			System.out.println("ConcreteClass1 doSomething");
		}

		@Override
		protected void doAnything() {
			System.out.println("ConcreteClass1 doAnything");
		}

	}
	
	public class ConcreteClass2 extends AbstractClass {

		@Override
		protected void doSomething() {
			System.out.println("ConcreteClass2 doSomething");
		}

		@Override
		protected void doAnything() {
			System.out.println("ConcreteClass2 doAnything");
		}

	}
	
	public class Clients {

		public static void main(String[] args) {
			
			AbstractClass class1 = new ConcreteClass1();
			class1.templateMethod();
			
			AbstractClass class2 = new ConcreteClass2();
			class2.templateMethod();
		}

	}
	
	模板方法模式的优点
	(1)封装不变部分,扩展可变部分。
	(2)提取公共部分代码,便于维护。
	
	模板方法使用的场景
	(1)多个类有共有的方法,并且逻辑基本相同时。
	(2)重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
	(3)重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过钩子函数约束
		其行为。
		
	public abstract class HummerModel {

		public abstract void start();
		
		public abstract void stop();
		
		public abstract void alarm();
		
		public abstract void engineBoom();
		
		public void run() {
			
			this.start();
			this.engineBoom();
			
			if (this.isAlarm()) {
				this.alarm();
			}
			
			this.stop();
			
		}
		
		// 钩子方法
		protected boolean isAlarm() {
			return true;
		}
		
	}
	
	public class HummerH1Model extends HummerModel {

		private boolean alarmFlag = true;
		
		@Override
		public void start() {
			System.out.println("H1 start.");
		}

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

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

		@Override
		public void engineBoom() {
			System.out.println("H1 enginBoom.");
		}

		protected boolean isAlarm() {
			return this.alarmFlag;
		}
		
		public void setAlarm(boolean isAlarm) {
			this.alarmFlag = isAlarm;
		}
	}
		
	public class HummerH2Model extends HummerModel {

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

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

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

		@Override
		public void engineBoom() {
			System.out.println("H2 enginBoom.");
		}
		
		protected boolean isAlarm() {
			return false;
		}

	}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics