设计模式------模板方法模式---桥梁模式
如果两个类的某个方法90%代码一样,怎么重用?
把不同的地方,抽出来变成一个方法,然后这两个类是继承关系,然后覆盖那个不同地方的方法就可以了~~~~
public abstract class CaffeineBeverage{ final void prepareRecipe(){ boilWater(); //固定的 brew(); //抽象的-----可以更加子类定制 pourInCup(); //固定的 addCondiments(); //抽象的 } protected abstract void brew(); protected abstract void addCondiments(); void boilWater(){ //实现 } void pourInCup(){ //实现 }}//但是有时候这些流程不是每个子类都有的,怎么办//下面使用判断语句,使得流程可选public abstract class CaffeineBeverage{ final void prepareRecipe(){ boilWater(); //固定的 brew(); //抽象的-----可以更加子类定制 if(getPourInCup()){ pourInCup(); //固定的 } addCondiments(); //抽象的 } abstract void brew(); //本来是可以用传参数的方法来处理变化的部分,但是java不支持传递函数这种类型作为参数,这样做就会有一个缺点,就是子类只能由一个这种实现,如果子类的这个部分也是变化的,怎么办。。?????方法是把这个东西变成接口,然后当作参数传递进来 abstract void addCondiments(); void boilWater(){ //实现 } void pourInCup(){ //实现 } public boolean getPourInCup(){ return true; }}//Java中的模板方法-----Array.sort();----这个方法里面封装了怎么排序,可以对任意数字排序,但是怎么排的实现在子类中,所以子类要实现Comparable接口public class Duck implements Comparable{ ~~~~~ public int compareTo(Object obj){ Duck otherDuck = (Duck)obj; if(this.weight - otherDuck.weight <0){ return -1; }else if(this.weight - otherDuck.weight >0){ return 1; }else { return 0; } }}Duck[] ducks = {~~~~~};Array.sort(ducks);//Swing中JFrame中的paint()方法。。。在默认状态下,paint()是不做事情的,因为它是一个"钩子",通过覆盖paint(),你可以将自己的代码插入JFrame的算法中,显示你所要话的图。。。。没想到这是一个模板方法的应用-----------------------------------------------------------模板方法的缺点:---多层次继承的缺点 父类有一个方法A,Son继承了这个方法,然后GrandSon也继承了这个方法,问题是突然有一天Son要重写父类的这个方法,他敢吗?绝对不敢,GrandSon可是要从Father继承过来这个方法A,你修改了,那就要修改Son和GrandSon之间的关系,那么这个风险就大了但是桥梁模式描述了类间弱关联关系,Father类完全可以把可能变化的方法放出去,Son子类要有这个方法很简单,桥梁搭过去,获得这个方法,GrandSon也一样,即使你Son子类不想使用这个方法了,也没有关系,不会对GrandSon产生影响。。。继承的好处,对于比较明确不变化的,通过继承来完成,若不能确定是否会变化,那么就芮乃伟是会变化的,通过桥梁模式来解决也就是说变化的子类里面也有变化,变化中的变化因为有抽象类,说明具体类不同-----》调用者在变化因为有接口,说明接口外的东西是不稳定的---》被调用者在变化随着时代的发展,枪在不停的变化改进。与此同时枪的子弹也在改进,很多子弹赋予了新功能:比如信号弹,救援弹,甚至是炸蛋(这里故意写错,要不然javaeye不让发表)。这样,枪是抽象的同时,子弹也是抽象的。二者组合起来变换无穷。与策略模式不同在于: 算法(过程)是不变的,变的是被调用者