模板模式与策略模式/template模式与strategy模式/行为型模式

模板模式

模版模式,又被称为模版方法模式,它可以将工作流程进行封装,并且对外提供了个性化的控制,但主流程外界不能修改,也就是说,模版方法模式中,将工作的主体架构规定好,具体类可以根据自己的需要,各自去实现。

几个要点,针对java:

  1. 抽象父类(防止实例化),公共方法(public),规定好工作流
  2. 抽象父类规定好抽象方法(protected),具体由子类实现,父类将抽象方法加入自己的工作流
  3. 具体子类实现父类的抽象方法
  4. 任意实例化的子类,都会按照父类工作流工作,只是部分(抽象方法实现)不同
abstract class Handle
    {
        public void handle()
        {
            a();
            b();
            c();
        }
        void a(){}
		void c(){}
        protected abstract void b();
    }

  class Handle1 extends Handle
    {
		@override
        protected override void b()
        {
            Console.WriteLine("Handle1");
        }
    }
  class Handle2 extends Handle
    {
		@override
        protected override void b()
        {
            Console.WriteLine("Handle2");
        }
    }

调用:

Handle handle=new Handle1();
handle.handle();

任意子类都会按照规定的工作流a()->b()->c()执行,部分(b方法)由具体子类去定义。

策略模式

针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

public interface ICalculator {  
    public int calculate(int a,int b);  
}  
public class Plus implements ICalculator {  
    @Override  
    public int calculate(int a,int b) {  
        return a+b;  
    }  
} 
public class Minus implements ICalculator {  
    @Override  
    public int calculate(int a,int b) {  
        return a-b;  
    }  
}

Class Calculator{
	ICalculator calculator;
	public Calculator(ICalculator calculator){
		this.calculator=calculator;
	}
	public int calculate(int a,int b){
	return calculator.calculate(a,b);
	}
}

当需要加法计算时:
Calculator plusCalculator=new Calculator(new Plus());
int result=plusCalculator.calculate(3,5);

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

策略模式和模板模式场景对比:

策略模式的应用场景
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),一般会定义一个接口规范,使用不同的策略方式去实现它
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
而模版方法模式的应用场景
1、多个类区别在于主流程中的某个细节
2、客户可以自已实现模版里的抽象方法
3、对客户隐藏具体的实现流程(方法的组合的顺序)

参考这里
参考这里

posted @ 2016-08-10 22:46  toto怎么会喝醉  阅读(325)  评论(0编辑  收藏  举报