常用设计模式-策略模式+工厂模式+模板模式(使用场景、解决方案)

在策略模式+工厂模式中,没有使用到模板模式,因为张三和李四的业务逻辑都是调用AAA方法,如果现在在增加一个方法,次方法只需要李四一人去实现BBB方法,此时张三的handel中就会报错,需要张三也去实现BBB方法,这时就出现了模板模式,即将接口变为抽象类,实现自己的方法即可.

优化前后:

	@Test
	String noDesign2() {
		String name = "张三";

		if (name.equals("张三")) {

			// 业务逻辑A
			return "张三完成任务AAA";

		} else if (name.equals("李四")) {

			// 业务逻辑B
			return "李四完成任务BBB";

		} 
		return "end";
	}

	// 工厂 + 策略 + 模板设计模式
	@Test
	void design2() {
		String name = "张三";

		AbstractHandler strategy = Factory2.getInvokeStrategy(name);

		strategy.AAA(name);

		//strategy.BBB(name);
	}

AbstractHandler:

import org.springframework.beans.factory.InitializingBean;

/**
 * 模板方法设计模式
 */
public abstract class AbstractHandler implements InitializingBean {

    public void AAA(String name) {
        throw new UnsupportedOperationException();
    }

    public String BBB(String name) {
        throw new UnsupportedOperationException();
    }
}

Factory2:

import com.google.common.collect.Maps;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * 工厂设计模式
 */
public class Factory2 {
    private static Map strategyMap = Maps.newHashMap();

    public static AbstractHandler getInvokeStrategy(String str) {
        return strategyMap.get(str);
    }

    public static void register(String str, AbstractHandler handler) {
        if (StringUtils.isEmpty(str) || null == handler) {
            return;
        }
        strategyMap.put(str, handler);
    }
}

ZhangSanHandler2:

import org.springframework.stereotype.Component;

@Component
public class ZhangSanHandler2 extends AbstractHandler {

    @Override
    public String AAA(String name) {
        // 业务逻辑B
        return "张三完成任务B";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Factory2.register("张三", this);
    }
}

LiSiHandler2:

import org.springframework.stereotype.Component;

@Component
public class LiSiHandler2 extends AbstractHandler {

    @Override
    public String BBB(String name) {
        // 业务逻辑B
        return "李四完成任务B";
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Factory2.register("李四", this);
    }
}

 

你可能感兴趣的:(设计模式)