设计模式(3)模板方法模式和策略模式

抽象模板设计模式

  • 由抽象出来的父类来编写代码中不变的部分。
  • 将变化的部分交给子类去完成。通过抽象方法让子类必须去完成
  • 抽象模板方法是遵循了里式替换设计原则,是对继承的一种优秀的使用经验
  • 例子:把大象装冰箱,分三步
    • 这是抽象模板方法设计模式中抽象出来的父类的描述方式
      (第一步:把冰箱门打开、第二步:把大象装进去、第三步:把冰箱门关上)
    • 具体的第二步需要先把大象XXX,然后xxx,再然后xxx

代码

模板设计模式

  • 抽取一个抽象模板类,同时定义模板方法 对于模板方法的实现,在子类中去实现
public abstract class GetTimeTemplate {

	// 固定流程方法
	public long getTime() {
		// 获取起始时间
		long t1 = System.currentTimeMillis();

		// 模板方法
		code();

		// 获取结束时间
		long t2 = System.currentTimeMillis();
		return t2 - t1;
	}
	// 钩子方法
	public abstract void code();
}

子类:

public class ForDemo extends GetTimeTemplate{

	@Override
	public void code() {
		
		//输出for循环
		for (int i = 0; i < 10000; i++) {
			System.out.println(i);
		}	
	}
}

测试类:

public class TemplateTest {

	public static void main(String[] args) {
		/*GetTime time = new GetTime();
		System.out.println("耗时 "+time.getTime()+" 毫秒");*/
		
		GetTimeTemplate time = new ForDemo();
		System.out.println("耗时 "+time.getTime()+" 毫秒");
		
		GetTimeTemplate time2 = new CopyFileDemo();
		System.out.println("耗时 "+time2.getTime()+" 毫秒");	
	}
}

策略模式

  • 将不同的算法分别封装到不同的类当中。便于扩展和维护
  • 策略模式就是让调用这些策略的使用者来讲,根本感知不到策略代码发生了扩展。
  • 一个类的行为或其算法可以在运行时更改
  • 策略模式有两种常用的使用方式
    • 一种就是你给我什么策略,我干什么事情

示例1:

  • 我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
  • StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。
    在这里插入图片描述

步骤1:

public interface Strategy { 
	public int doOperation(int num1, int num2); 
}

步骤2:

public class OperationAdd implements Strategy{
	@Override 
	public int doOperation(int num1, int num2) { 
		return num1 + num2; 
	} 
}
public class OperationSubstract implements Strategy{ 
	@Override 
	public int doOperation(int num1, int num2) { 
		return num1 - num2; 
	} 
}
public class OperationMultiply implements Strategy{ 
	@Override 
	public int doOperation(int num1, int num2) {
		return num1 * num2; 
	} 
}

步骤3:

public class Context { 
	private Strategy strategy; 
	public Context(Strategy strategy){ 
		this.strategy = strategy; 
	}
	public int executeStrategy(int num1, int num2){ 
		return strategy.doOperation(num1, num2); 
	} 
}

步骤 4:

public class StrategyPatternDemo { 
	public static void main(String[] args) { 
		Context context = new Context(new OperationAdd()); 	
		System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); 
		context = new Context(new OperationSubstract()); 
		System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); 
		context = new Context(new OperationMultiply()); 
		System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); 
	} 
}

步骤 5:

10 + 5 = 15 
10 - 5 = 5 
10 * 5 = 50
  • 还有一种就是我自己拥有很多策略,我会根据具体的情况去选择具体的策略
public interface TravelStrategy {
	
	//出行方式
	void travelWay();
				
	boolean isOK(int type);
	}
						
public class PersonContext {
	// 拥有一个出行策略引用
	private List<TravelStrategy> strategylist;

	public PersonContext() {
		this.strategylist = new ArrayList<>();
		strategylist.add(new AirPlanelStrategy());
		strategylist.add(new TrainStrategy());
		strategylist.add(new BicycleStrategy());
	}


public void travel(int juli) {
	// 根据具体策略类,执行对应的出行策略
	for (TravelStrategy travelStrategy : strategylist) {
		if (travelStrategy.isOK(juli)) {
			travelStrategy.travelWay();
			break;
		}
	}
}

举个栗子:锦囊妙计(对外来说,长得都差不多)

  • 策略模式其实很多时候都是可以优化if语句的。

举个栗子 :

  • 将计算行为抽象出来,作为策略接口(Strategy),而这个接口下面有加法计算行为、有乘法计算行为。
  • 将Mybatis中3.0版本中的NodeHandler的部分使用策略模式去改造。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值