Template Method形式和Strategy模式有何异同

Template Method模式和Strategy模式有何异同
Template Method模式很容易理解,就是由基类提供一个模板,将各子类中不变的行为提取到基类中实现,而各子类中可变的行为则由各子类自己重写基类方法实现.
Strategy则是在使用策略模式的应用实例内部维护一个策略实例,针对不同的子类用不同的策略实现.

来看看两者的代码实现:

Template Method模式 -- 基类
package com.dzeay.pattern.template_method;

public class BaseTemplate {
    public void doSameThing() {
        System.out.println("BaseTemplate.doSameThing");
    }

    public void doOtherThing() {
        System.out.println("BaseTemplate.BaseTemplate");
    }
}


Template Method模式 -- 子类A
package com.dzeay.pattern.template_method;

public class AClass extends BaseTemplate {
    @Override
    public void doOtherThing() {
        System.out.println("AClassImpl.doOtherThing");
    }
}


Template Method模式 -- 子类B
package com.dzeay.pattern.template_method;

public class BClass extends BaseTemplate {
    @Override
    public void doOtherThing() {
        System.out.println("BClassImpl.doOtherThing");
    }
}


Template Method模式 -- 测试类
package com.dzeay.pattern.template_method;

/**
 * <pre>
 * Template Method(模板方法模式)详解: 
 * 由基类提供一个模板,将各子类中不变的行为提取到基类中实现,
 * 而各子类中可变的行为由各子类自己重写基类方法实现
 * </pre>
 * 
 * @author <a href="mailto:dzeay.com@gmail.com">dzeay.com</a>
 * @since 2010-11-15
 * @version 1.0
 */
public class TestClass {
    /**
     * 
     * @param args
     */
    public static void main(String[] args) {
        BaseTemplate aClass = new AClass();
        aClass.doSameThing();
        aClass.doOtherThing();

        BaseTemplate bClass = new BClass();
        bClass.doSameThing();
        bClass.doOtherThing();
    }
}


Strategy模式 -- 策略接口
package com.dzeay.pattern.strategy;

public interface IStrategy {
    public void doOtherThing();
}


Strategy模式 -- 策略A
package com.dzeay.pattern.strategy;

public class AStrategy implements IStrategy {
    @Override
    public void doOtherThing() {
        System.out.println("AStrategy.doOtherThing");
    }
}



Strategy模式 -- 策略B
package com.dzeay.pattern.strategy;

public class BStrategy implements IStrategy {
    @Override
    public void doOtherThing() {
        System.out.println("BStrategy.doOtherThing");
    }
}


Strategy模式 -- 应用
package com.dzeay.pattern.strategy;

public class Context {
    private IStrategy strategy;

    public Context() {

    }

    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void doOtherThing() {
        this.strategy.doOtherThing();
    }

    public void setStrategy(IStrategy strategy) {
        this.strategy = strategy;
    }
}


Strategy模式 -- 测试类
package com.dzeay.pattern.strategy;

/**
 * <pre>
 * Strategy(策略模式)详解:
 * 在使用策略模式的应用实例内部维护一个strategy实例,针对不同的子类用不同的策略实现
 * </pre>
 * 
 * @author <a href="mailto:dzeay.com@gmail.com">dzeay.com</a>
 * @since 2010-11-15
 * @version 1.0
 */
public class TestClass {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Context context = new Context();

        context.setStrategy(new AStrategy());
        context.doOtherThing();

        context.setStrategy(new BStrategy());
        context.doOtherThing();
        
        context.setStrategy(new IStrategy() {            
            @Override
            public void doOtherThing() {
                System.out.println("doOtherThing");
            }
        });
        context.doOtherThing();
    }
}


未完待续 ........