设计模式之策略模式(一)

来自一位@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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值