1.模版模式: 父类实现算法,子类实现细节(一个线程启动的start方法,为什么我们要去实现run方法呢,因为Thread这个类的设计是采用template designer)
package com.jack.templatedesigner;
abstract class StartProgram {
protected String name;
public StartProgram(String name){
this.name = name;
}
//不想让调用者关注到我们实现的细节,这也是面向对象思想封装的一个体现
abstract protected void run();
//加个final 将不被继承 因为算法一旦确定就不允许更改, 更改也只允许算法的所有者也就是他的主人更改, 如
//果调用者都可通过继承进行修改,那么算法将没有严谨性可言
public final void start(){
run();
}
}
package com.jack.templatedesigner;
class ThreadProgram extends StartProgram{
public ThreadProgram(String name) {
super(name);
}
protected void run() {
System.out.println("Thread name: "+this.name);
}
}
public class ThreadTest{
public static void main(String args[]){
ThreadProgram thread = new ThreadProgram("thread 1");
thread.start();
}
}
2.策略模式:将具体业务逻辑与抽象分离 strtegy dsign
package com.jack.strategy;
/**
* 策略接口,主要是规范或者让结构程序知道如何进行调用
*/
public interface CalcStrategy {
int calc(int x, int y);
}
package com.jack.strategy;
/**
* 程序的结构,里面约束了整个程序的框架和执行的大概流程,但并未涉及到业务层面的东西
* 只是将一个数据如何流入如何流出做了规范,只是提供了一个默认的逻辑实现
* @author Administrator
*/
class Caculator {
private int x = 0;
private int y = 0;
private CalcStrategy strategy = null;
public Caculator(int x,int y){
this.x = x;
this.y = y;
}
public Caculator(int x,int y,CalcStrategy strategy){
this(x,y);
this.strategy = strategy;
}
public int calc(int x, int y) {
return x+y;
}
/**
* 只需关注接口,并且将接口用到的入参传递进去即可,并不关心到底具体是要如何进行业务封装
* @return
*/
public int result(){
if(null != strategy){
return strategy.calc(x, y);
}
return calc(x,y);
}
public void start(){
System.out.println(result());
}
}
class AddSrategy implements CalcStrategy{
public int calc(int x, int y) {
// TODO Auto-generated method stub
return x + y;
}
}
class SubStrategty implements CalcStrategy{
public int calc(int x, int y) {
// TODO Auto-generated method stub
return x - y;
}
}
package com.jack.strategy;
public class StrategyTest {
public static void main(String args[] ) {
//没有任何策略时的结果
Caculator c1 = new Caculator(1,1);
c1.start();
//传入减法策略的结果
Caculator c2 = new Caculator(10,30, new SubStrategty());
c2.start();
//看到这里就可以看到策略模式强大了,算法可以随意设置,系统的结构并不会发生任何变化
Caculator c3 = new Caculator(2,3,new CalcStrategy(){
public int calc(int x, int y) {
// TODO Auto-generated method stub
return x+10/(y+1)*2;
}
});
c3.start();
}
}
3.Thread :template desigher strategy designer 对照
package com.jack.thread1;
public class ThreadTest {
public static void main(String args[]){
new Thread(new Runnable(){
public void run() {
System.out.println(Thread.currentThread().getName());
}}
).start();
}
}