作者:千珏
邮箱:[email protected]
公众号:千珏
标题:设计模式之策略模式(转载请标明出处)
hello,各位观众老爷们大家好,这期讲解的是设计模式之策略模式,不知道有多少观众老爷看过千珏前几期关于设计模式的文章,一直追设计模式这个系列的观众老爷肯定很少,也有观众老爷和我反映说设计模式太枯燥了而且学了之后到一个新的系统里面还是不知道如何使用,在这里千珏想说的是,设计模式就是那么抽象的东西,要想学好设计模式不能只靠死记硬背要多理解,只是背的话永远都没有办法用到自己的系统里。
不说废话了,下面进入正文,这期讲的策略模式,你们工作的时候或多或少都写过,只是你们不知道自己用的是策略模式而已,比如千珏下面给个demo给你们看一下你们就知道了。
Demo
public class Test {
public void testMethod() {
System.out.println("插入前");
//TODO 千珏想在这动态的插入一段代码
//TODO 只有运行时才知道这里做的事是什么,编译期不知道
System.out.println("插入后");
}
}
看到上面的//TODO部分的注释,是不是直接就想到了接口,只要写个接口放在这里,我们只要实现接口就好了,然后在运行的时候动态的传入实现类给这个方法就好了,下面看看千珏是怎么实现的吧。
public interface TestInterface {
//千珏想动态实现的东西
void doSomething();
}
然后改动一下原来的Test类,变成下面这样
public class Test {
public void testMethod(TestInterface testInterface) {
System.out.println("插入前");
testInterface.doSomething();
System.out.println("插入后");
}
}
然后我们只要实现TestInterface这个接口,上面的类是不是就可以动态的插入代码了。
public class TestInterfaceImpl implements TestInterface {
@Override
public void doSomething() {
System.out.println("do something....");
}
}
public class TestInterfaceImpl2 implements TestInterface {
@Override
public void doSomething() {
System.out.println("do something2....");
}
}
下面我们来测试一下上面的代码,看看他是否能达到我们想要的输出(QAQ)
public class TestMain {
public static void main(String []args){
Test test = new Test();
test.testMethod(new TestInterfaceImpl());
System.out.println();
test.testMethod(new TestInterfaceImpl2());
}
}
上面的代码输出为:
插入前
do something…
插入后插入前
do something2…
插入后
ohhhhh,输出结果完全符合预期。
相信大家也看到了,上面就是我们在代码里面会经常做的操作,也就是定义一个接口然后定义几个类来实现这个接口,在类方法里面把参数定义成接口,然后在业务里面调用这个方法的时候传入自己的实现类进去,这就是策略模式。
定义
老规矩先看百度百科是怎么定义策略模式的。
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
总结
感觉策略模式没啥好讲的,因为我们代码里面经常出现的设计模式,或许就是策略模式了,观众老爷们你们可以把这篇文章当成科普文。
下一篇预告,装饰器模式。