使用Lambda表达式重构模板方法

1.模板方法

如果你需要采用某个算法的框架, 同时又希望有一定的灵活度, 能对它的某些部分进行改进,那么采用模板方法设计模式是比较通用的方案。好吧,这样讲听起来有些抽象。换句话说,模板方法模式在你“希望使用这个算法,但是需要对其中的某些行进行改进,才能达到希望的效果”时是非常有用的。 

让我们从一个例子着手, 看看这个模式是如何工作的。 假设你需要编写一个简单的在线银行应用。 通常, 用户需要输入一个用户账户, 之后应用才能从银行的数据库中得到用户的详细信息,最终完成一些让用户满意的操作。不同分行的在线银行应用让客户满意的方式可能还略有不同,比如给客户的账户发放红利, 或者仅仅是少发送一些推广文件。 你可能通过下面的抽象类方式来实现在线银行应用:

public class OnlineBanking {

	public void processCustomer(int id) {
		Customer c = Database.getCustomerWithId(id);
	}

	static private class Customer {
	}

	static private class Database {
		static Customer getCustomerWithId(int id) {
			return new Customer();
		}
	}
}

processCustomer 方法搭建了在线银行算法的框架:获取客户提供的ID,然后提供服务让用户满意。不同的支行可以通过继承 OnlineBanking 类,对该方法提供差异化的实现。 

2.使用lambda表达式

使用你偏爱的Lambda表达式同样也可以解决这些问题(创建算法框架,让具体的实现插入某些部分) 。你想要插入的不同算法组件可以通过Lambda表达式或者方法引用的方式实现。 这里我们向 processCustomer 方法引入了第二个参数,它是一个 Consumer<Customer> 类型的参数,与前文定义的 makeCustomerHappy 的特征保持一致: 

public void processCustomer(int id, Consumer<Customer> makeCustomerHappy) {
	Customer c = Database.getCustomerWithId(id);
	makeCustomerHappy.accept(c);
}

现在,你可以很方便地通过传递Lambda表达式,直接插入不同的行为,不再需要继承OnlineBanking 类了:

new OnlineBankingLambda().processCustomer(1224, (Customer c) -> System.out.println("Hello!"));

Lamba表达式能帮助你解决设计模式与生俱来的设计僵化问题。 

完整代码如下:

public class OnlineBankingLambda {

	public static void main(String[] args) {
		new OnlineBankingLambda().processCustomer(1224, (Customer c) -> System.out.println("Hello!"));
	}

	public void processCustomer(int id, Consumer<Customer> makeCustomerHappy) {
		Customer c = Database.getCustomerWithId(id);
		makeCustomerHappy.accept(c);
	}

	// dummy Customer class
	static private class Customer {
	}

	// dummy Database class
	static private class Database {
		static Customer getCustomerWithId(int id) {
			return new Customer();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/u013230189/article/details/80865438