策略模式-常用设计模式

    离毕业还有一段时间。最近闲来无事,打算系统的学习下设计模式。

    专门在博客里面新开了一个分类,主要记录下自己对常用设计模式的理解。同样还是算对自己的一个敦促吧。争取两天一篇吧。

    这次学习设计模式主要是通过看Headfirst系列的设计模式一书。之所以选择这本书,来入门,是因为身边挺多同学,看过这个,并且十分推荐。我之前也大概浏览过,我想大家之所以这么推荐的原因可能是因为,headfirst系列一贯都有深入浅出,语言风趣幽默的特点吧。好了,兴趣是最好的老师。配着插图学技术,感觉也不是什么坏事是吧?~

-----我是分割线------------------------------------------------------------

策略模式

    策略模式,在headfirst设计模式中的定义是这样的:策略模式定义了算法族,分别封装起来,让它们之前可以相互替换。这个模式可以使算法的变化独立于使用算法的客户。

    UML类图:

策略模式-常用设计模式_第1张图片

(上图转自百度图片)

对应书中的定义。strategy接口,定义了策略类的公共接口。也就是书中定义的需要进行单独封装的算法。在代码中,我们可以自行实现任意多个Strategy的实现类,例如:ConcreteStrategyA,ConcreteStrategyB。。。

在这些实现中,我们需要实现接口中AlgorithmInterface()方法,作为具体的算法。

在Context类中,维护了一个Strategy类型的引用。用来引用一个具体的ConcreteAtrategyA等类型的具体算法对象。这里采用父类引用指向子类对象的方式,可以方便利用面向对象的多态的特性。

然后在Context对象的ContextInterface()方法中,通过Strategy类型的引用,调用具体的Strategy实现类对象中的AlgorithmInterface()方法,完成具体的工作。

说道这里,其实用一句话就可以总结:策略模式,其实最核心的地方就是,它是采用组合而非继承,来实现对算法代码的复用的。这也体现出了,我们在代码设计中的一个常用的原则就是--尽量使用组合,而尽量少用继承。

主要区别如下:


  1. 首先,继承是代码的编译期间实现的。
  2. 而,组合则是在程序运行时实现的。

倒不是说,在编译期实现有什么不好。主要是因为当我们采用组合的方式实现时,就可以在程序运行时具有非常的灵活性。试想,你可以在程序运行的过程当中,通过将新的Strategy实现类ConcreteStrategyC的对象实例,赋值给Context成员Strategy引用,这样就可以在ContextInterface()中,通过引用调用全新的算法实现了。而这种动态所带来的灵活性是继承的方式所没有的。(当然,继承也是一种实现代码复用的重要手段。但并不是唯一手段,这是像我这样的新手经常忽略的问题。因为我在写代码的时候,动不动就喜欢采用继承的方式。好像使用了继承,就是使用了OO的设计思路。就能达到比较好的代码复用效果。)

例子代码:

package strategy;

public interface Strategy {

	public void AlgorithmInterface();
}



package strategy;

public class ConcreteStrategyA implements Strategy {

	@Override
	public void AlgorithmInterface() {
		//这里是算法的具体实现
		//
		//
		System.out.println("ConcreteStrategyA");
		
	}

}



package strategy;

public class ConcreteStrategyB implements Strategy {

	@Override
	public void AlgorithmInterface() {
		//这里是算法的具体实现
		//
		//
		System.out.println("ConcreteStrategyB");
		
	}

}



package strategy;

public class Context {

	private Strategy s = null;

	public Strategy getS() {
		return s;
	}

	public void setS(Strategy s) {
		this.s = s;
	}

	public Context(Strategy s) {
		this.s = s;
	}
	
	public void ContextInterface(){
		s.AlgorithmInterface();
	}
	
	public static void main(String[] args) {
		Context c = new Context(new ConcreteStrategyA());
		c.ContextInterface();
		//灵活的动态改变算法的具体实现
		c.setS(new ConcreteStrategyB());
		c.ContextInterface();
	}
}



运行结果:


策略模式-常用设计模式_第2张图片


the end~

(小学语文水平,标点符号用的也比较乱。可能是写少的原因吧。想想上次写作文,也差不多是七八年前的事情了。嗯,慢慢写的多了应该就好了。这对自己应该也算是一个锻炼吧。O(∩_∩)O~)


你可能感兴趣的:(策略模式-常用设计模式)