来自一位@IT-Coder
策略模式:
定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
打个小比喻:在IT公司里需要会各种语言各种技能的Coder,但是每位Coder都有自己的特长,我们得根据不同项目需求选择不同的Coder。
因为Coder的编程语言、编程技能模块是不断变化的,所以我们把它们会的语言、技能独立出来,以组合的方式与Coder结合在一起。
如下图
Programmer: //Coder,父类
age //猿们的青春都奉献给Code
name //但我们还是希望别人记住我们的名字:Jobs
Professional //猿们会的技能,以组合的方式做为猿的一种属性
Language //猿们使用的语言,以组合的方式做为一种属性
Professional: //面向接口编程,这是技能的接口
professional() //该方法介绍猿媛们会的技术
Language: //这是使用的编程语言的接口
language() //该方法介绍我们使用的编程语言
来,上代码:
这是我们工程师们使用的语言:
/**
*
* 编程语言好多的
* C/JAVA/PYTHON...
* @author IT-Coder
*
*/
public interface Language {
public void language();
}
/**
*
* 会Java语言的飘过~~
* @author IT-Coder
*
*/
public class Java implements Language {
@Override
public void language() {
System.out.println("I can use Java code to develop applications");
}
}
/**
*
* 会Java和Python的飘过
* @author IT-Coder
*
*/
public class JavaAndPython implements Language {
@Override
public void language() {
System.out.println("I can use Java and Python code to develop applications");
}
}
这是我们工程师们会的技能
/**
*
* 专攻方向也是有好多的
* 数据挖掘/Web工程师/架构师...
* @author IT-Coder
*
*/
public interface Professional {
public void professional();
}
/**
*
* 会 android 的飘过
* @author IT-Coder
*
*/
public class Android implements Professional {
@Override
public void professional() {
System.out.println("I can make app");
}
}
/**
*
* 会 Web 的飘过
* @author IT-Coder
*
*/
public class Web implements Professional {
@Override
public void professional() {
System.out.println("I can make website");
}
}
这是我们工程师的统称
/**
* 我们年青我们有体!!
*/
protected int age;
/**
* 小猿们的存在感
*/
protected String name;
/**
* 策略模式的核心
* 可以把我们现有的各种算法
* 组合到我们的程序中
*/
protected Language language;
protected Professional professional;
public Programmer(int age, String name) {
this.age = age;
this.name = name;
}
/**
* 程序猿也是要自我介绍的啦
*/
public void selfIntroduction() {
StringBuffer buffer = new StringBuffer();
buffer.append("Hi, guys\n")
.append("my name is ")
.append(name)
.append(" and ")
.append(age);
System.out.println(buffer.toString());
myLanguage();
myProfessional();
System.out.println("thank you!\n");
}
//介绍我的外语
public void myLanguage() {
language.language();
}
//介绍我的技能
public void myProfessional() {
professional.professional();
}
接下来,是我们请来的几类工程师
/**
*
* 一位会安卓的java coder
* @author IT-Coder
*
*/
public class JavaAndroidEngineer extends Programmer {
public JavaAndroidEngineer(int age, String name) {
super(age, name);
this.language = new Java();
this.professional = new Android();
}
}
/**
*
* 一位会web的java coder
* @author IT-Coder
*
*/
public class JavaWebEngineer extends Programmer {
public JavaWebEngineer(int age, String name) {
super(age, name);
this.language = new Java();
this.professional = new Web();
}
}
Show Time
/**
*
* 作为程序猿的自我介绍
* @author IT-Coder
*
*/
public class CoderIntroduction {
public static void main(String[] args) {
//让一个java web攻城狮自我介绍好不好?
JavaWebEngineer javaWebCoder = new JavaWebEngineer(24, "John");
javaWebCoder.selfIntroduction();
//让一个android攻城狮自我介绍好不好?
JavaAndroidEngineer javaAndroidCoder = new JavaAndroidEngineer(25, "Jake");
javaAndroidCoder.selfIntroduction();
//两年后,jake 又学会了Python,现在他会两种语言啦
//把我们的Java 和 Python 语言组合到Jake 身上
javaAndroidCoder.setAge(27);
javaAndroidCoder.setLanguage(new JavaAndPython());
javaAndroidCoder.selfIntroduction();
}
}
输出:
Hi, guys
my name is John and 24
I can use Java code to develop applications
I can make website
thank you!
Hi, guys
my name is Jake and 25
I can use Java code to develop applications
I can make app
thank you!
Hi, guys
my name is Jake and 27
I can use Java and Python code to develop applications
I can make app
thank you!
微博@IT-Coder