策略模式、上下文与内部类的思考

策略模式简介

         策略模式一直程序开发中,最经常使用的模式之一;它的功能就是定义了一系列的算法,这些算法定义着公共的接口,因此它们之间能够相互替换。这使得咱们在开发过程当中,如有新的策略须要扩展时,程序变的很容易开发。下面是策略模式的结构示意图:java

 

         从结构示意图中,咱们能清楚的感觉到,策略模式的巧妙之处就是将变化的东西(这里咱们称之为算法)经过定义一个相同的公共的接口封装且隔离;以不一样的策略实现相同的接口,使程序可以完成各类任务的同时,让上层的编程针对接口,实现不变,也不关心其调用的是哪一种策略。算法

 

上下文的引入

         然而在实际开发中,咱们的需求每每不会像结构示意图那样,如此简单、如此simple。实际较为常见的状况就是:上层的调用须要与接口之间有必定的交互。交互的多是一些属性,或是一些方法。这样的交互每每会让接口变的难以调用;因而上下文的引入就是势在必行。将相关的属性或一些公共的方法封装到上下文中,让上下文去和接口进行复杂的交互。而上层的调用只须要跟上下文打交道就能够。下面有包含上下文的策略模式结构示意图:编程


         仔细看看两个结构示意图的变化,其实不外乎将变的东西和不变的东西进行封装与隔离,这样不变的东西可以尽量的减少其变化,而变的东西更容易修改或扩充;其实这也正是软件设计的基本原则。ide

         透过示意图,咱们上下文对象,将本身传递给接口,方便接口调取它的属性与方法,以完成交互。如此将前面提到的交互的行为提取出来,封装在本身内部,对上层提供统一调用方法。也正是将变化与不变封装且隔离。this

 

延迟设计与内部类

         正如前面提到的,上下文中封装了上层调用类与接口间的交互;但这些交互有个前提,那就是它们能被抽象出来。另外一些交互在咱们的业务需求中没法被抽象出来。换句话说,这些交互,就是要延迟到上层调用内中来设计与实现的。在这种状况下:上层调用类与接口的某个策略的实现每每是紧耦合的、而且它们是一对一。spa

         要完成它们之间的这种交互,设计它们间通信的方法,会让代码变杂乱,同时也增长了调用接口的难度。.net

         这时内部类的优点能够在此发挥:咱们将接口的实现类放到上层调用类中,变成上层调用类的一个内部类;因为内部类能够任意调用其外部类的属性和方法的特性。它们能直接的无阻碍的通信,彻底不一样设计多余的接口方法来完成交互;如此一来也正好符合它们一对一的关系。下面是我简单写的一个小Demo设计

 策略接口:code

/**
 * 策略算法接口
 * @author Breath_L
 *
 */
public interface Strategy {
	public void doStrategy(Context cont);
}

上下文类:orm

/**
 * 上下文类
 * @author Breath_L
 *
 */
public class Context {
	
	private String baseTxt;
	private Strategy strategy;
	
	public Context(String baseTxt, Strategy strategy){
		this.baseTxt = baseTxt;
		this.strategy = strategy;
	}
	/**
	 * 暴露给上层对象调用的方法
	 */
	public void doStrategyNow(){
		//公共逻辑...
		System.out.println(baseTxt);
		strategy.doStrategy(this);
		//公共逻辑...
	}
}

上层调用类:

public class TopGetter {
	
	public Strategy in_strategy;
	
	public Context context;
	
	public TopGetter(){
		in_strategy  = new Strategy(){
			@Override
			public void doStrategy(Context cont) {
				System.out.println(beDependent());			
			}
			
		};
		context = new Context("Hello World !", in_strategy);
	}
	
	private String beDependent(){
		return "We will rock you !";
	}
	
	public void startHere(){
		context.doStrategyNow();
	}
	
	public static void main(String[] args){
		TopGetter topGetter = new TopGetter();
		topGetter.startHere();
	}
}

         仔细思考上下文和内部类,它们算是策略模式在封装和隔离变与不变的东西时,的一个深刻设计。万变不离其中的仍是软件设计的基本原则。仍是那句话:没有最完美的设计,只有最符合业务的实现。也许此刻的思考只是符合我最近的业务,不怕见笑,作一下记录与分享。

        原创博客,转载请注明:http://my.oschina.net/BreathL/blog/52655

相关文章
相关标签/搜索