方法模版模式(设计模式_11)【精品博客】

今天给大家介绍的是:模版方法模式,这个模式非常的常见,很多开发者,无意中其实就已经用到了,也非常简单,只是还不知道,这属于一种设计模式而已,而关于这个设计模式,在网上有很多专业性词语来说明,看的人审美疲劳。



其实这个设计模式,通俗易懂的来讲,就是把子类重复的东西,定义到父类中模块化起来,父类只需要去管理好算法流程框架,把经常变化的点,让子类去继承完成。



我们看下面几道案例来理解就OK了:



案例一:

  • 在很久很久以前,有一个小山村,住在这里面的小朋友上学无比困难,因为这个小村庄太过于偏僻,像是被大山围住了一样,出行非常不便,
  • 于是这个小山村里面的村民,就集体花钱给这个小村庄办了一个小学校,经过两年后,也正是的开始在上课了,晓明是这个学校的学生,学习非常
  • 努力,学习也是这个班级比较厉害的,有一次班级考试,由于学校资金紧缺,没有试卷,所以学校老师把题目写在黑板上,让学生们抄下来,作为
  • 试卷题目,由于之前晓明看书离书比较近,眼睛成了近视眼,把黑板上的题目抄错了,把里面的数字7抄写成了1,晓明自信满满的完成了考试,
  • 也认为没有问题,而老师在批改的时候不会很认真的看题目,只是去对照答案…,最后等试卷发下来才知道原因,回到家中还被父母批评,
  • 晓明很苦恼…….

    我们先把晓明的这次题目抄错:用代码实现…..

晓明:

/**
 * 用此类模拟晓明
 * @author Liudeli
 */

public class XiaoMing {

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {

        System.out.println("1)在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用()关键字来申明父类的这些方法。"
                + "a) Final "
                + "b) Static "
                + "c) Abstract "
                + "d) Void"
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {

        System.out.println("2) 在java中,以定义了两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()"
                + "a) interface A extends B,C  "
                + "b) interface A implements B,C  "
                + "c) class A implements B,C"
                + "d) class A implements B,implements C "
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {

        System.out.println("3) 在java中,在定义类时加上修饰符()可以实现该类不能在本类被实例化。"
                + "a) Final  "
                + "b) Public  "
                + "c) c) Private "
                + "d) Abstract "
                + "");

        System.out.println("答案是:" + answer);

    }

}

晓明同学A:

/**
 * 同学A
 * @author Liudeli
 */
public class StudentA {

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {

        System.out.println("1)在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用()关键字来申明父类的这些方法。"
                + "a) Final "
                + "b) Static "
                + "c) Abstract "
                + "d) Void"
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {

        System.out.println("2) 在java中,以定义了两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()"
                + "a) interface A extends B,C  "
                + "b) interface A implements B,C  "
                + "c) class A implements B,C"
                + "d) class A implements B,implements C "
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {

        System.out.println("3) 在java中,在定义类时加上修饰符()可以实现该类不能在本类被实例化。"
                + "a) Final  "
                + "b) Public  "
                + "c) c) Private "
                + "d) Abstract "
                + "");

        System.out.println("答案是:" + answer);

    }

}

晓明同学B:

/**
 * 同学B
 * @author Liudeli
 */
public class StudentB {

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {

        System.out.println("1)在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用()关键字来申明父类的这些方法。"
                + "a) Final "
                + "b) Static "
                + "c) Abstract "
                + "d) Void"
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {

        System.out.println("2) 在java中,以定义了两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()"
                + "a) interface A extends B,C  "
                + "b) interface A implements B,C  "
                + "c) class A implements B,C"
                + "d) class A implements B,implements C "
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {

        System.out.println("3) 在java中,在定义类时加上修饰符()可以实现该类不能在本类被实例化。"
                + "a) Final  "
                + "b) Public  "
                + "c) Private "
                + "d) Abstract "
                + "");

        System.out.println("答案是:" + answer);

    }

}

考试的很多同学回答(举例三个,其他省略….)

/**
 * 测试程序
 * @author Liudeli
 */

public class MainClass {

    public static void main(String[] args) {

        // 晓明抄了三个题目 而且在考试的那天回答完成...
        XiaoMing xiaoMing = new XiaoMing();
        xiaoMing.subject1("a");
        xiaoMing.subject2("d");
        xiaoMing.subject3("b");

        // 晓明的同学A抄了三个题目 而且在考试的那天回答完成...
        StudentA  studentA= new StudentA();
        studentA.subject1("c");
        studentA.subject2("b");
        studentA.subject3("c");

        // 晓明抄了三个题目 而且在考试的那天回答完成...
        StudentB studentB = new StudentB();
        studentB.subject1("c");
        studentB.subject2("a");
        studentB.subject3("d");

    }

}


运行结果:



  • 我们现在跳出晓明在小山村上学的故事…,直接回到编程中来分析:

    以上的这种写法有很多的问题,晓明/晓明同学A/晓明同学B

    省略 …..

    抄黑板上面的题目是一模一样的,那么多同学一旦有人把题目抄错了,会造成很多麻烦,而且要抄那么多次,

    做了很多重复的事情,而且扩展性不好,维护性也不好,所以我们应该把,这么多同学抄写相同题目给抽取出来



定义父类方法模版:

/**
 * 定义一个题目类,把所有的题目给抽取出来,公共出来
 * @author Liudeli
 */
public class Subject {

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {

        System.out.println("1)在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用()关键字来申明父类的这些方法。"
                + "a) Final "
                + "b) Static "
                + "c) Abstract "
                + "d) Void"
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {

        System.out.println("2) 在java中,以定义了两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()"
                + "a) interface A extends B,C  "
                + "b) interface A implements B,C  "
                + "c) class A implements B,C"
                + "d) class A implements B,implements C "
                + "");

        System.out.println("答案是:" + answer);

    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {

        System.out.println("3) 在java中,在定义类时加上修饰符()可以实现该类不能在本类被实例化。"
                + "a) Final  "
                + "b) Public  "
                + "c) Private "
                + "d) Abstract "
                + "");

        System.out.println("答案是:" + answer);

    }

}

晓明:

/**
 * 用此类模拟晓明
 * @author Liudeli
 */

public class XiaoMing extends Subject{

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {
        subject1(answer);
    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {
        subject2(answer);
    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {
        subject3(answer);
    }

}

晓明同学A:

/**
 * 同学A
 * @author Liudeli
 */
public class StudentA extends Subject{

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {
        subject1(answer);
    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {
        subject2(answer);
    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {
        subject3(answer);
    }

}

晓明同学B:

/**
 * 同学B
 * @author Liudeli
 */
public class StudentB extends Subject{

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1(String answer) {
        subject1(answer);
    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2(String answer) {
        subject2(answer);
    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3(String answer) {
        subject3(answer);
    }

}

测试程序:

/**
 * 测试程序
 * @author Liudeli
 */
public class Main {

    public static void main(String[] args) {

        Subject xiaoMing = new XiaoMing();
        xiaoMing.subject1("c");
        xiaoMing.subject2("c");
        xiaoMing.subject3("d");

        Subject studentA = new StudentA();
        studentA.subject1("a");
        studentA.subject2("b");
        studentA.subject3("c");

        Subject studentB = new StudentB();
        studentB.subject1("c");
        studentB.subject2("b");
        studentB.subject3("c");

    }

}

运行结果




从晓明同学类系列中分析,他们还有很多重复的区域,例如:方法重复,所以我们需要一个父类模版

把唯一在变的在子类中完成把重复的全部都在父类中完成**

查看重复项(晓明类,同学A,同学B…..,他们方法(subject1(), subject2(), subject3())都一模一样,唯一不一样的就是答案,继承的体现要继承的够彻底, 所以要抽取代码):



父类抽取唯一改变点给子类去完成:


/**
 * 定义一个题目类,把所有的题目给抽取出来,公共出来
 * @author Liudeli
 */
public abstract class Subject {

    /**
     * 题目一
     * @param answer 传入参数为答案
     */
    public void subject1() {

        System.out.println("1)在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用()关键字来申明父类的这些方法。"
                + "a) Final "
                + "b) Static "
                + "c) Abstract "
                + "d) Void"
                + "");

        System.out.println("答案是:" + answerMethod1()); // 注意:这里只需子类去完成,只需学习回答答案即可

    }

    /**
     * 题目二
     * @param answer 传入参数为答案
     */
    public void subject2() {

        System.out.println("2) 在java中,以定义了两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()"
                + "a) interface A extends B,C  "
                + "b) interface A implements B,C  "
                + "c) class A implements B,C"
                + "d) class A implements B,implements C "
                + "");

        System.out.println("答案是:" + answerMethod2()); // 注意:这里只需子类去完成,只需学习回答答案即可

    }

    /**
     * 题目三
     * @param answer 传入参数为答案
     */
    public void subject3() {

        System.out.println("3) 在java中,在定义类时加上修饰符()可以实现该类不能在本类被实例化。"
                + "a) Final  "
                + "b) Public  "
                + "c) Private "
                + "d) Abstract "
                + "");

        System.out.println("答案是:" + answerMethod3()); // 注意:这里只需子类去完成,只需学习回答答案即可

    }

    /**
     * 定义答案抽象方法,第一个题目的答案
     * @return 返回答案
     */
    public abstract String answerMethod1();

    /**
     * 定义答案抽象方法,第二个题目的答案
     * @return 返回答案
     */
    public abstract String answerMethod2();

    /**
     * 定义答案抽象方法,第三个题目的答案
     * @return 返回答案
     */
    public abstract String answerMethod3();

}

晓明类:

/**
 * 用此类模拟晓明
 * @author Liudeli
 */

public class XiaoMing extends Subject{

    /*
       晓明的目的就是填答案,只负责自己的职责,这也是单一职责原则的体现,
       其他的试卷制作过程,题目怎么制造出来,根本不需要去关心
    */
    public String answerMethod1() {return "a";}

    public String answerMethod2() {return "c";}

    public String answerMethod3() {return "b";}

}

晓明同学A类:

/**
 * 同学A
 * @author Liudeli
 */
public class StudentA extends Subject{

    /*
        晓明的同学A的目的就是填答案,只负责自己的职责,这也是单一职责原则的体现,
        其他的试卷制作过程,题目怎么制造出来,根本不需要去关心
    */
    public String answerMethod1() {return "c";}

    public String answerMethod2() {return "c";}

    public String answerMethod3() {return "a";}

}

晓明同学B类:

/**
 * 同学B
 * @author Liudeli
 */
public class StudentB extends Subject{

    /*
        晓明的同学A的目的就是填答案,只负责自己的职责,这也是单一职责原则的体现,
        其他的试卷制作过程,题目怎么制造出来,根本不需要去关心
    */
    public String answerMethod1() {return "c";}

    public String answerMethod2() {return "c";}

    public String answerMethod3() {return "a";}

}




案例二:

狗,鸡,猫 他们都有 叫的行为,可以这样来实现:

/**
 * 定义一个猫类
 * @author Liudeli
 */
public class Cat {

    /**
     * 猫的叫方法
     */
    public void call() {
        System.out.println("喵喵喵!!!");
    }

}

/**
 * 定义一个鸡类
 * @author Liudeli
 */
public class Chicken {

    /**
     * 鸡的叫方法
     */
    public void call() {
        System.out.println("咯咯咯!!!");
    }

}

/**
 * 定义一个狗类
 * @author Liudeli
 */
public class Dog {

    /**
     * 狗的叫方法
     */
    public void call() {
        System.out.println("汪汪汪!!!");
    }

}

/**
 * 测试程序
 * @author Liudeli
 */
public class Main {

    public static void main(String[] args) {
        // 狗,鸡,猫 他们都有 叫的行为,可以这样来实现

        Dog dog = new Dog();
        dog.call();

        Cat cat = new Cat();
        cat.call();

        Chicken chicken = new Chicken();
        chicken.call();

    }

}

运行结果:



父类抽取相同项,模版方法方式实现:

狗,鸡,猫 他们都有 叫的行为,而他们的行为相同,都是叫,所以可以把相同的行为抽取出来定义父类模版,

* 这就是方法模版模式了,把唯一不同需要变化的交给子类去做..

/**
 * 定义一个动物类,抽取共用的行为,定义成模版
 * @author Liudeli
 */
public abstract class Animal {

    /**
     * 动物的叫方法
     */
    public void call() {
        System.out.println(callValue());
    }

    /**
     * 叫声是动物唯一不同的,所以这个是具体动物需要变换的值
     * 定义抽象 叫声
     * @return 返回叫声
     */
    public abstract String callValue();

}

/**
 * 定义一个猫类
 * @author Liudeli
 */
public class Cat extends Animal{

    /**
     * 猫的叫声
     */
    public String callValue() {
        return "喵喵喵!!!";
    }

}

/**
 * 定义一个鸡类
 * @author Liudeli
 */
public class Chicken extends Animal{

    /**
     * 鸡的叫声
     */
    public String callValue() {
        return "咯咯咯!!!";
    }

}

/**
 * 定义一个狗类
 * @author Liudeli
 */
public class Dog extends Animal{

    /**
     * 狗的叫声
     */
    public String callValue() {
        return "汪汪汪!!!";
    }

}

/**
 * 测试程序
 * @author Liudeli
 */
public class Main {

    public static void main(String[] args) {

        Animal dog = new Dog();
        dog.call();

        Animal cat = new Cat();
        cat.call();

        Animal chicken = new Chicken();
        chicken.call();

    }

}

运行结果:





案例三:

我们来简单模拟 Android Activity 执行过程,一个应用App有很多的Activity,登录,注册,主界面

省略…

这些界面中,都有返回操作,隐藏标题栏操作,等等,都把这些共同点抽取到父类模块

错误写法:

/**
 * 简单的模拟Android中的Activity
 * @author Liudeli
 */
public class Activity {

    /**
     * 模拟Android中的 onCreate()方法
     */
    public void onCreate() {

    }

    /**
     * 模拟Android中的 onDestroy()方法
     */
    public void onDestroy() {

    }

}

/**
 * 模拟Activity中的登录操作
 * @author Liudeli
 */
public class LoginActivity extends Activity {

    /**
     * 模拟登录中的 onCreate()方法
     */
    public void onCreate() {
        System.out.println("onCreate()...");
    }

    /**
     * 模拟登录中的 onDestroy()方法
     */
    public void onDestroy() {
        System.out.println("onDestory()...");
    }

    /**
     * 模拟返回
     */
    public void back() {
        System.out.println("登录界面返回操作...");
    }

    /**
     * 隐藏标题栏
     */
    public void hideTitle() {
        System.out.println("登录界面隐藏标题栏操作...");
    }
}

/**
 * 模拟Activity中的主界面操作
 * @author Liudeli
 */
public class MainActivity extends Activity {

    /**
     * 模拟主界面中的 onCreate()方法
     */
    public void onCreate() {
        System.out.println("onCreate()...");
    }

    /**
     * 模拟主界面中的 onDestroy()方法
     */
    public void onDestroy() {
        System.out.println("onDestory()...");
    }

    /**
     * 模拟返回
     */
    public void back() {
        System.out.println("主界面返回操作...");
    }

    /**
     * 隐藏标题栏
     */
    public void hideTitle() {
        System.out.println("主界面隐藏标题栏操作...");
    }

}

/**
 * 模拟Activity中的注册操作
 * @author Liudeli
 */
public class RegisterActivity extends Activity {

    /**
     * 模拟注册中的 onCreate()方法
     */
    public void onCreate() {
        System.out.println("onCreate()...");
    }

    /**
     * 模拟注册中的 onDestroy()方法
     */
    public void onDestroy() {
        System.out.println("onDestory()...");
    }

    /**
     * 模拟返回
     */
    public void back() {
        System.out.println("注册界面返回操作...");
    }

    /**
     * 隐藏标题栏
     */
    public void hideTitle() {
        System.out.println("注册界面隐藏标题栏操作...");
    }

}

提炼代码:

/**
 * 简单的模拟Android中的Activity
 * @author Liudeli
 */
public class Activity {

    /**
     * 模拟Android中的 onCreate()方法
     */
    public void onCreate() {

    }

    /**
     * 模拟Android中的 onDestroy()方法
     */
    public void onDestroy() {

    }

}

/**
 * 抽取共用的行为
 * @author Liudeli
 */
public class BaseActivity extends Activity{

    /**
     * 模拟返回
     */
    public void back() {
        System.out.println("界面返回操作...");
    }

    /**
     * 隐藏标题栏
     */
    public void hideTitle() {
        System.out.println("界面隐藏标题栏操作...");
    }

}

/**
 * 模拟Activity中的登录操作
 * @author Liudeli
 */
public class LoginActivity extends BaseActivity {

    /**
     * 模拟登录中的 onCreate()方法
     */
    public void onCreate() {
        // 在某种业务情况下,隐藏标题栏
        if (true) {
            hideTitle();
        }
        System.out.println("onCreate()...");
    }

    /**
     * 模拟登录中的 onDestroy()方法
     */
    public void onDestroy() {
        // 在某种业务情况下,隐藏标题栏
        if (true) {
            back();
        }
        System.out.println("onDestory()...");
    }

}

/**
 * 模拟Activity中的主界面操作
 * @author Liudeli
 */
public class MainActivity extends BaseActivity {

    /**
     * 模拟主界面中的 onCreate()方法
     */
    public void onCreate() {
        // 在某种业务情况下,隐藏标题栏
        if (true) {
            hideTitle();
        }
        System.out.println("onCreate()...");
    }

    /**
     * 模拟主界面中的 onDestroy()方法
     */
    public void onDestroy() {
        // 在某种业务情况下,隐藏标题栏
        if (true) {
            back();
        }
        System.out.println("onDestory()...");
    }

}

/**
 * 模拟Activity中的注册操作
 * @author Liudeli
 */
public class RegisterActivity extends BaseActivity {

    /**
     * 模拟注册中的 onCreate()方法
     */
    public void onCreate() {
        // 在某种业务情况下,隐藏标题栏
        if (true) {
            back();
        }
        System.out.println("onCreate()...");
    }

    /**
     * 模拟注册中的 onDestroy()方法
     */
    public void onDestroy() {
        // 在某种业务情况下,隐藏标题栏
        if (true) {
            back();
        }
        System.out.println("onDestory()...");
    }
}




案例四:

模拟:

小军在一家小型创业公司,公司开发Java的人员,就他一个人,他在实现一个功能,此功能

就是传入两个数,在传入运算符进行计算,把结果用漂亮的界面显示出来!

最近公司新招聘了一个Java工程师(小欧),不如把工作任务分担,把一些计算功能给小欧来完成,把界面显示就小军自己来完成

/**
 * 定义一个运算类
 * @author Liudeli
 */
public abstract class Operation {

    /**
     * 一个简单的方法,计算两个值,把结果用漂亮界面显示出来
     * @param number1
     * @param type
     * @param number2
     */
    public void showResultStyle(double number1, String type, double number2) {
        // 把这个计算的功能,给小欧去做
        double result = operationResult(number1, type, number2);
        // 小军值关注html 样式界面显示出来就可以了
        System.out.println("<html 这里面写了漂亮的样式....>结果是:" + result + "</html>");
    }

    /**
     * 定义一个抽象函数,此函数为计算方法,把这个计算方法给小欧去完成
     * @param number1
     * @param type
     * @param number2
     * @return
     */
    public abstract double operationResult(double number1, String type, double number2);
}

把运算功能给新来的同事小欧去做,小欧只需继承父类方法,完成子类要完成的功能即可:

/**
 * 这个类是用于计算数值
 * @author Liudeli
 */
public class Algorithm extends Operation{

    public double operationResult(double number1, String type, double number2) {
        double resultOperator = 0;
        try {
            if ("+".equals(type)) {
                resultOperator = number1 + number2;
            } else if ("-".equals(type)) {
                resultOperator = number1 - number2;
            } else if ("*".equals(type)) {
                resultOperator = number1 * number2;
            } else if ("/".equals(type)) {
                resultOperator = number1 / number2;
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("输入有误!!! e:" + e.toString());
        }
        return resultOperator;
    }

}


子类与子类多个子类都要相同的行为,应该把这些行为,用父类方法模版抽取出来,子类只完成变化点即可,这也属于开放封闭式原则,更好的维护性扩展性,同时自然也是复用性



谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,

刘德利CSDN博客, http://blog.csdn.net/u011967006

时间: 2024-10-02 09:25:17

方法模版模式(设计模式_11)【精品博客】的相关文章

算法常用设计模式(子博客)

1. 枚举法 根据具体问题枚举出各种可能,从中选出有用信息或者问题的解. 这种方法利用计算机的速度优势,在解决简单问题时十分有效. 2. 贪心法 如前所述,根据问题的信息尽可能做出部分的解,并基于部分解逐步扩充得到完整的解. 在解决复杂问题时,这种做法未必能得到最好的解. 3. 分治法 把复杂问题分解为相对简单的子问题,分别求解,最后通过组合起子问题的解的方式得到原问题的解. 4. 回溯法(搜索法)  专指通过探索的方式求解. 如果问题很复杂,没有清晰的求解路径,可能就需要分步骤进行,而每一步骤

使用jxls技术导入Excel模版数据(转自其他博客)

第一步:先确定好Excel导入的格式以及各表格字段值的含义 第二步:定义好解析的XML--videoConfig.xml <?xml version="1.0" encoding="UTF-8"?> <workbook> <worksheet name="Sheet1"> <section startRow="0" endRow="0"/> <loop

求组合数的方法:转载自VincentCZW的博客

遇到了就查了下:地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/18/2508189.html 求一个组合数Cnm的值,Cnm= n! /(n-m)!*m!化简的结果为 Cnm = (n*(n-1)*…*(n-m+1))/m! 这个直接求根据公式直接求显然是不行的,当n和m较大时,显然是要溢出的.目前知道两种解决这种题的思路: 思路一:可以利用递推关系式Cnm = C(n)(m-1) + C(n-1)(m-1)来实现,这样初始化前几

2015~2016学年第1学期《软件架构与设计模式》学生博客列表

序号 学生 1 郭风顺(134171711) 2 陈维静(134173302) 3 梅红忆(134173321) 4 邱姣妮(134173324) 5 戎一波(134173328) 6 闻利浙(134173339) 7 包存斌(134173601) 8 杨林希(134173643) 9 毛衎煜(134173726) 10 陈怡蓉(134173303) 2015年11月12日,截止序号10.

关于博客模式变化的说明

最近写博客感觉越来越没状态,渐渐有种记流水账的感觉.我把博客发给朋友看了一下,听了朋友的一些看法,越来越确定自己对博客的一些定位需要改变,现在此对需要改变的地方与改变的原因做个具体的说明,我希望我对自己写的博客能做到:没有敷衍. 改变博客内容的展开模式.我之前写博客的目的是结合自己学习python的过程对python做一个从零开始的学习教程,这是以整个博客为单元的一个系列专题.现改为由单个博客文章为单元的,不仅限于python的非系列性质文章.意思是之后的博客没有明显的前后衔接关系,每一个博客都

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔

博客代码美化(SyntaxHighlighter)

这篇博文主要讲解自己使用SyntaxHighlighter对代码进行美工中遇见的问题以及如何使用SyntaxHighlighter? 首先来看看SyntaxHighlighter对代码美工的效果吧! 2015年8月23日以前贪玩小神个人博客代码效果如下: function helloSyntaxHighlighter(){return "hi!";} 使用SyntaxHighlighter美化代码效果如下: ? 1 2 3 4 5 6 function helloSyntaxHighl

IT博客、社区

FreeBuf:http://www.freebuf.com/ Android的话,国内的论坛不敢恭维,推荐国外的:1.AndroidForums.com,听名字就知道是干嘛的吧,里面也有Developer 101功能,很适合新手,可以提诸如,学习Android开发应该从哪里开始?建议?教程?之类的问题.2.anddev.org,新手问题和高级教程都有,而且问题分类做的非常细致.3.Devshed,有应用开发培训课程,话题较广泛,资源也多.(PS:需要梯子)4.Making Money with

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,